-r nome_do_arquivo &&. nome do arquivo

0

Eu estava apenas olhando para um script que eu encontrei nesta linha. Alguém pode me dizer o que esta linha faz. esta é a linha de código.

[ -r "$PosConfigDir/posconfig.sh" ] && . "$PosConfigDir/posconfig.sh"
    
por The Bharat 07.03.2016 / 11:18

1 resposta

5

Ele verifica se você tem permissão para r ead o arquivo $PosConfigDir/posconfig.sh , depois da resolução do link simbólico, depois fontes desse arquivo.

Não garante que você possa ler o arquivo. Por exemplo, na maioria dos sistemas, [ -r / ] retornaria verdadeiro, mas você não pode ler / .

-r é um operador de teste padrão .

. é um comando embutido especial de shells semelhantes a Bourne que informa o shell para ler e interpretar o código no arquivo dado como argumento. source é o comando equivalente em csh . Muitos shells modernos semelhantes a Bourne entendem source como um alias para . .

Com algumas implementações de shell, a falha de . de abrir ou ler o arquivo faria com que o shell fosse interrompido (após ter gerado uma mensagem de erro). Provavelmente, o -r check destina-se a evitar isso nesse caso.

Para evitar que o shell aborte, em shells POSIX, uma alternativa poderia ser

 command . "$PosConfigDir/posconfig.sh"

(Embora a construção acima não funcione em zsh a menos que em sh ou ksh emulação)

Para evitar a mensagem de erro, você precisaria redirecionar a saída do stderr para /dev/null , mas isso teria o efeito colateral indesejado de também silenciar os erros dos comandos em postconfig.sh .

Um exemplo:

$ [ -r /etc/os-release ] && . /etc/os-release
$ printf '%s\n' "$PRETTY_NAME"
Debian GNU/Linux 8 (jessie)

PRETTY_NAME foi definido em /etc/os-release file:

$ head -n 1 /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
    
por 07.03.2016 / 11:22