Quero encurtar isso para uma linha:
if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi
Eu uso frequentemente []
para condicionais, por exemplo, [ -z(or -n) condition]
mas ainda não tive que fazer outra parte neste formato.
Em Ruby eu faria. condition ? true : false
Existe um equivalente no bash?
tentei
[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'
mas obviamente essa não é a maneira certa de fazer isso.
Eu quero uma linha única porque quero que todas as minhas .bashrc
caibam em uma janela pequena (<~ 50 linhas), então, como acontece com outras linhas múltiplas, eu as condenso em uma linha quando possível. Sinto-me confortável em sacrificar a legibilidade pelo tamanho deste exemplo.
Eu também tentei:
[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'
e
[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'
e
[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'
mas eu sempre recebo o alias 'else' e não o alias 'then'
Eu poderia simplesmente reverter, mas suspeito que, como não está funcionando direito, isso não ajudaria. A única maneira de ter certeza é experimentá-lo no OSX e estou no Ubuntu agora.
Responder1
dr;
Usar
ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'`
Detalhes....
[...]
são necessários apenas para avaliar expressões condicionais (estatísticas de arquivos, comparações de strings, comparações numéricas; veja CONDITIONAL EXPRESSIONS
em bash(1)
). Eles também seriam necessários para isso em uma if ... ; then ...; else
construção.
Para construções relativamente simples
if CONDITION; then
EXPR1
else
EXPR2
fi
pode ser substituído por
CONDITION && EXPR1 || EXPR2
Se não precisa [...]
no primeiro caso, não precisa no segundo.
No seu caso , CONDITION
esse ls --version 2>/dev/null | grep -q 'coreutils'
é o código de retorno de grep
. Então você pode simplesmente escrever
ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'
BTW: Seria mais fácil verificar se ls
suporta --color
diretamente:
ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'
Responder2
Com zsh
, pode ser compactado para:
if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}
A cmd1 && cmd2 || cmd3
construção como um substituto para if/then/else geralmente deve ser evitada, pois não é a mesma coisa.
Em
cmd1 && cmd2 || cmd3`
cmd2
é executado se cmd1
retornar true
. E cmd3
é executado se qualquer um doscmd1
oucmd2
retorna falso.
No seu caso cmd2
( alias
) é muito improvável que retorne falso, mas é fácil esquecer o problema no caso geral, por isso é melhor evitar essa construção em primeiro lugar.
A únicarealO motivo pelo qual pode ser útil é quando você deseja escrever código que funcione em shells do tipo Bourne e do tipo csh (ou em rc
shells do tipo -onde isso também funciona), onde a if/then/else
construção tem sintaxe diferente.