La pregunta es sobre variables especiales. La documentación dice:
!!:$
designa el último argumento del comando anterior . Esto puede
acortarse a !$
.
($_
, un guión bajo.) Al iniciar el shell, establezca la ruta de acceso absoluta utilizada para invocar el shell o el script de shell que se está ejecutando tal como se pasa en el entorno
o en la lista de argumentos. Posteriormente, se expande al último argumento del comando anterior después de la expansión. También se establece en el nombre de ruta completo utilizado para invocar cada comando ejecutado y colocado en el entorno
exportado a ese comando.
Debe haber alguna diferencia que no puedo captar, porque:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
¿Cuál es la diferencia?
Respuesta aceptada:
!$
es un indicador de palabra de la expansión del historial, se expande a la última palabra del comando anterior en historia . IOW, la última palabra de la entrada anterior en la historia. Esta palabra suele ser el último argumento del comando, pero no en caso de redirección. en:
echo "hello" > /tmp/a.txt
el comando completo 'echo "hello" > /tmp/a.txt'
apareció en el historial, y /tmp/a.txt
es la última palabra de ese comando.
_
es un parámetro de shell, se expande al último argumento del comando anterior. Aquí, la redirección no es parte de los argumentos pasados al comando, por lo que solo hello
es el argumento pasado a echo
. Por eso $_
expandido a hello
.
_
ya no es uno de los parámetros especiales estándar de shell. Funciona en bash
, zsh
, mksh
y dash
solo cuando es interactivo, ksh93
solo cuando dos comandos están en líneas separadas:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1