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 .bashrc
en 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 EXPRESSIONS
en bash(1)
). También serían necesarios para eso en una if ... ; then ...; else
construcció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 , CONDITION
ese 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 ls
compatible --color
directamente:
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 || cmd3
construcción como reemplazo de if/then/else generalmente debe evitarse ya que no es lo mismo en absoluto.
En
cmd1 && cmd2 || cmd3`
cmd2
se ejecuta si cmd1
regresa true
. Y cmd3
se ejecuta si cualquiera decmd1
ocmd2
devuelve 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 rc
similares donde eso también funciona) donde la if/then/else
construcción tiene una sintaxis diferente.