Expressões e operadores condicionais desconhecidos

2

Eu precisava do bash para obter o meu .bashrc no login para um novo terminal no meu mac (porque ele não faz isso no login para um novo terminal no macs, ele só faz .bash_profile). Eu encontrei e usei com sucesso este comando e o adicionei ao meu .bash_profile:

if [ -f ~/.bashrc ] && [ "${SHELL##*/}" == "bash" ]
then
  . ~/.bashrc
fi

Há três coisas sobre esse comando que não entendo.

  1. O que significa o -f na primeira condição?
  2. O que o ## / indica na segunda condição?
  3. Eu entendo que ". ~ / .bashrc" serve para ter a fonte shell que rc, mas como no mundo esse comando faz isso? O que é "." deveria indicar aqui?
por cloud_ctrl 17.09.2011 / 04:27

2 respostas

3

  1. -f é um predicado que testa para ver se um arquivo específico (~ / .bashrc, neste caso) existe.

  2. ##*/ como parte de uma substituição de variável significa remover algo que termina em "/" desde o início do valor da variável - por exemplo, se SHELL fosse "/ usr / local / bin / bash", removeria o "/ usr / local / bin /" e apenas dar "bash". Em detalhes: ## significa remover a correspondência mais longa possível do que segue, */ corresponde a qualquer coisa terminada em "/".

    Outras opções relacionadas: # significa remover a correspondência mais curta (ou seja, #*/ removeria por meio do primeiro "/"), %% significa remover a correspondência mais longa possível do > end , e % significa remover a correspondência mais curta do final.

  3. . é um nome mais curto para o comando source - um comando interno do shell que executa o conteúdo de um script (~ / .bashrc neste caso) no shell atual. Normalmente, se você executar um script de shell, ele será executado em um subshell e todas as variáveis, aliases, funções etc. que ele definir serão perdidas quando ele sair; por source ing, as coisas que ele define são válidas no shell atual.

por 17.09.2011 / 05:00
1

1) verifica se o arquivo ~ / .bashrc existe

2) $ {SHELL} é uma variável que contém o caminho completo do shell atual. Se você digitar echo $SHELL ou echo ${SHELL} em um terminal, ele imprimirá o caminho. $ {SHELL ## * /} remove o caminho e apenas imprime o nome do arquivo. Digite echo ${SHELL##*/} em um terminal para ver.

3) o período "." é um comando bash integrado para executar um script no processo atual. I.E. ele origina um arquivo.

Então, essa linha basicamente diz, "se o arquivo ~ / .bashrc existir e o shell atual for um shell bash, então source ~ / .bashrc"

Meu ~ / .bash_profile contém apenas:

source $HOME/.bashrc
    
por 17.09.2011 / 04:57

Tags