¿Cómo puedo acortar un if then else usando el formato []?

¿Cómo puedo acortar un if then else usando el formato []?

Quiero abreviar esto a una sola línea:

if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi

Lo uso frecuentemente []para condicionales, por ejemplo, [ -z(or -n) condition]pero aún no he tenido que hacer otra parte en este formato.

En Ruby lo haría. condition ? true : false ¿Existe un equivalente en bash?

Lo intenté

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'

pero obviamente esa no es la forma correcta de hacerlo.

Quiero una sola línea porque quiero que todo quepa .bashrcen una ventana pequeña (<~50 líneas), por lo que, al igual que con otras líneas múltiples, las condenso en una sola línea cuando sea posible. Me siento cómodo sacrificando la legibilidad por el tamaño en este ejemplo.

También probé:

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

y

[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

y

[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

pero siempre obtengo el alias 'otro', no el alias 'entonces'

Podría simplemente revertirlo, pero sospecho que, como no funciona correctamente, eso no ayudaría. Sin embargo, la única forma de estar seguro es probarlo en OSX y ahora estoy en Ubuntu.

Respuesta1

tl;dr;

Usar

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'`

Los detalles...
[...]solo son necesarios para evaluar expresiones condicionales (estadísticas de archivos, comparaciones de cadenas, comparaciones numéricas; ver CONDITIONAL EXPRESSIONSen bash(1)). También serían necesarios para eso en una if ... ; then ...; elseconstrucción.

Para construcciones relativamente simples

if CONDITION; then
    EXPR1
else
    EXPR2
fi

puede ser reemplazado por

CONDITION && EXPR1 || EXPR2

Si no lo necesitas [...]en el primer caso, no lo necesitas para el segundo.

En su caso , CONDITIONese ls --version 2>/dev/null | grep -q 'coreutils'es el código de retorno de grep. Entonces puedes simplemente escribir

ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'

Por cierto: sería más fácil comprobar si es lscompatible --colordirectamente:

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'

Respuesta2

Con zsh, se puede comprimir a:

if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}

La cmd1 && cmd2 || cmd3construcción como reemplazo de if/then/else generalmente debe evitarse ya que no es lo mismo en absoluto.

En

cmd1 && cmd2 || cmd3`

cmd2se ejecuta si cmd1regresa true. Y cmd3se ejecuta si cualquiera decmd1 ocmd2devuelve falso.

En su caso, es muy poco probable que cmd2( alias) devuelva falso, pero es fácil olvidarse del problema en el caso general, por lo que es mejor evitar esa construcción en primer lugar.

El únicorealLa razón por la que puede ser útil es cuando desea escribir código que funcione en shells tipo Bourne y csh (o rcsimilares donde eso también funciona) donde la if/then/elseconstrucción tiene una sintaxis diferente.

información relacionada