.png)
Quero definir um alias dependendo de uma correspondência de padrão de variável ambiental em 1 linha.
Eu estou tentando:
[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
mas eu entendo-bash: [[uscamwebq20.boston.zipcar.com: command not found
Eu também tentei:
$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'
mas eu entendo-bash: [: too many arguments
Responder1
case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac
Você está recebendo um erro, porque faltam espaços depois [[
e porque -z
é para testar se uma determinada string está vazia. [[
é um recurso não padrão, como ele se comporta depende da versão do bash
. A case
estrutura é POSIX e conforme escrita funcionará em qualquer shell POSIX e em qualquer versão do bash
.
De maneira mais geral, também é melhor ficar longe de coisas assim, cmd1 && cmd2 || cmd3
pois geralmente não faz o que você deseja se cmd2
falhar.
Além disso, não vejo sentido em colocar tudo em uma linha. Isso é algo que irá para algum arquivo rc, certo? Então será muito mais legível se estiver em várias linhas.
case $HOSTNAME in
(*q20*) alias a='cd ~/a1';;
(*) alias a='cd ~/a99'
esac
é mais legível e portátil do que:
if [[ $HOSTNAME =~ q20 ]]; then
alias a='cd ~/a1'
else
alias a='cd ~/a99'
fi
em si mais legível (e mais correto) do que:
[[ $HOSTNAME =~ q20 ]] &&
alias a='cd ~/a1' ||
alias a='cd ~/a99'
em si mais legível do que
[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
Responder2
Você pode usar o primeiro formulário, mas precisa colocar um espaço em branco depois [[
. Ver:
$ type [[
[[ is a shell keyword
$ help [[
[[ ... ]]: [[ expression ]]
Execute conditional command.
Então seu comando deve ficar assim:
[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'