.png)
Quiero establecer un alias dependiendo de una coincidencia de patrón de variable ambiental en 1 línea.
Estoy intentando:
[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
pero lo entiendo-bash: [[uscamwebq20.boston.zipcar.com: command not found
También probé:
$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'
pero lo entiendo-bash: [: too many arguments
Respuesta1
case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac
Recibes un error porque faltan espacios después [[
y porque -z
es para probar si una cadena en particular está vacía. [[
es una característica no estándar, su comportamiento depende de la versión de bash
. La case
estructura es POSIX y, tal como está escrita, funcionará en cualquier shell POSIX y en cualquier versión de bash
.
En términos más generales, también es mejor mantenerse alejado de cosas como, cmd1 && cmd2 || cmd3
ya que generalmente no hace lo que quieres si cmd2
falla.
Además, no veo el sentido de ponerlo todo en una sola línea. Eso es algo que irá a algún archivo rc, ¿verdad? Entonces será mucho más legible si está en varias líneas.
case $HOSTNAME in
(*q20*) alias a='cd ~/a1';;
(*) alias a='cd ~/a99'
esac
es más legible y portátil que:
if [[ $HOSTNAME =~ q20 ]]; then
alias a='cd ~/a1'
else
alias a='cd ~/a99'
fi
en sí mismo más legible (y más correcto) que:
[[ $HOSTNAME =~ q20 ]] &&
alias a='cd ~/a1' ||
alias a='cd ~/a99'
en sí mismo es más legible que
[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
Respuesta2
Puedes usar el primer formulario pero debes poner un espacio en blanco después [[
. Ver:
$ type [[
[[ is a shell keyword
$ help [[
[[ ... ]]: [[ expression ]]
Execute conditional command.
Entonces tu comando debería verse así:
[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'