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 el nombre de ruta absoluto utilizado para invocar el shell o el script de shell que se ejecuta como se pasa en el entorno o la lista de argumentos. Posteriormente, se expande hasta el último argumento del comando anterior después de la expansión. Establezca también 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 pueda 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?
bash
shell
history-expansion
Telar
fuente
fuente
$_
. Eso es crucial Es posible que no explique la diferencia que lo desconcierta, pero explica muchas otras formas$_
y!$
no son lo mismo.Respuestas:
!$
es un designador de palabras de expansión de la historia, se expande hasta la última palabra del comando anterior en la historia . IOW, la última palabra de la entrada anterior en la historia. Esta palabra suele ser el último argumento para ordenar, pero no en caso de redirección. En:todo el comando
'echo "hello" > /tmp/a.txt'
apareció en la historia, 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 sehello
pasa el argumentoecho
. Por eso se$_
expandió ahello
._
no es uno de los parámetros especiales estándar shell . Funciona enbash
,zsh
,mksh
ydash
sólo cuando interactiva,ksh93
sólo cuando dos comandos están en líneas separadas:fuente
!$
expansión frente al$_
parámetro es queecho $_
siempre se muestra en el historial comoecho $_
, mientras queecho !$
muestra el valor al que se expandió. Por ejemplo ,echo one two
luegoecho !$
, presionando hacia arriba se muestraecho two
.