Solo me pregunto por qué esto no funciona
#!/bin/bash
ls /bin
ls !$
Espero correr ls /bindos veces, pero la segunda genera errores porque !$no fue interpretada
¿Me perdí algo o !$solo trabajé en la línea de comando?
No pude encontrar parte relevante en man bash(en mac)

Respuestas:
El historial y la expansión del historial están deshabilitados de forma predeterminada cuando el shell se ejecuta de forma no interactiva.
Necesitas:
o:
afectará a todas las instancias de bash que
script.shpuedan ejecutarse.fuente
bashejecutascript.sh, pero también a todas las otrasbashinstancias quescript.sheventualmente pueden ejecutarse (como otrosbashscripts ...).bashinstancia que ejecute su script.Lo más sensato sería
o
o
Advertencias: vale la pena recordar que cada una de estas viene con algunas trampas. La solución $ _ solo captura el último argumento simple: por
ls foo barlo tanto , dejará $ _ conteniendo solobar. El uno usandosetanulará los argumentos ($1,$2, etc). Y todo esto tal como está escrito funcionará, pero cuando se generaliza a comandos más complejos (donde el escape y el espacio en blanco son importantes), puede encontrar algunas dificultades. Por ejemplo:ls 'foo bar'(donde el argumento de nombre de ruta únicofoo barcontiene dos o más espacios, o cualquier otro espacio en blanco) no se comportará correctamente en ninguno de estos ejemplos. Es posible que se necesite escapar adecuadamente (posiblemente combinado con unevalcomando), o usar en"$@"lugar de$*, para evitar esos casos.fuente
$_camino no es portátil, tienes razón. Elsetenfoque funciona en un tablero no interactivo, y con el${1+"$@"}truco (más el alias global de zsh) debería ser general, aunque recuerdo vagamente quesettiene un historial de no ser perfectamente portátil con algunos shells (¿viejos?). El enfoque de definir-una-variable-mantener-el-comando-y-luego-evaluarlo, especialmente usando un escape apropiado y unevalcomando real , es completamente portátil por lo que yo sé.