Solo me pregunto por qué esto no funciona
#!/bin/bash
ls /bin
ls !$
Espero correr ls /bin
dos 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.sh
puedan ejecutarse.fuente
bash
ejecutascript.sh
, pero también a todas las otrasbash
instancias quescript.sh
eventualmente pueden ejecutarse (como otrosbash
scripts ...).bash
instancia 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 bar
lo tanto , dejará $ _ conteniendo solobar
. El uno usandoset
anulará 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 bar
contiene 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 uneval
comando), o usar en"$@"
lugar de$*
, para evitar esos casos.fuente
$_
camino no es portátil, tienes razón. Elset
enfoque 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 queset
tiene 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 uneval
comando real , es completamente portátil por lo que yo sé.