Como posso encurtar um if then else usando o formato

Como posso encurtar um if then else usando o formato

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 .bashrccaibam 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 EXPRESSIONSem bash(1)). Eles também seriam necessários para isso em uma if ... ; then ...; elseconstruçã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 , CONDITIONesse 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 lssuporta --colordiretamente:

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 || cmd3construçã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 cmd1retornar true. E cmd3é executado se qualquer um doscmd1 oucmd2retorna 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 rcshells do tipo -onde isso também funciona), onde a if/then/elseconstrução tem sintaxe diferente.

informação relacionada