Supongamos que tengo el siguiente ejemplo trivial en mi history
:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Si quisiera ejecutar comandos 77
, 78
y 79
en un comando, ¿existe un atajo para esto? Lo he intentado !77 !78 !79
, lo que simplemente los colocará a todos en una sola línea para ejecutar.
!77 ; !78 ; !79
bien?!77-79
)Respuestas:
EDITAR: puede hacer esto de manera compatible con POSIX con la herramienta de comando de reparación
fc
:Esto abrirá su editor (probablemente
vi
) con los comandos 77 a 79 en el búfer. Cuando guarde y salga (:x
), se ejecutarán los comandos.Si no desea editarlos y está MUY SEGURO de saber a qué comandos está llamando, puede usar:
Esto se usa
true
como un "editor" para editar los comandos, por lo que simplemente sale sin hacer ningún cambio y los comandos se ejecutan tal cual.RESPUESTA ORIGINAL:
Puedes usar:
Esto supone que no está utilizando ningún alias o funciones ni ninguna variable que solo esté presente en el entorno de ejecución actual, ya que, por supuesto, no estarán disponibles en el nuevo shell que se está iniciando.
Una mejor solución (gracias a Michael Hoffman por recordarme en los comentarios) es:
¡Uno de los muy, muy pocos casos donde
eval
es realmente apropiado!Ver también:
fuente
cd
, pero ese es un caso marginal.eval "$(history -p \!{77..79})"
Deberia trabajar.Respuesta simple: en lugar de
!77 !78 !79
,!77; !78; !79
para hacer lo que parece estar intentando hacer: ejecute el comando 77, y luego el comando 78, y luego el comando 79, incondicionalmente, o!77 && !78 && !79
para ejecutar el comando 77 y verifique si tuvo éxito. Y luego, si el comando 77 tuvo éxito, ejecute el comando 78. Y luego, si el comando 78 tuvo éxito, ejecute el comando 79.Respuesta ligeramente más inteligente (si está en una ventana de tipo terminal):
\!
en tuPS1
.82 history
, entonces su próximo comando es 83.!-6
. Esto volverá a ejecutar el comando 77.!-6
, cópielo y péguelo. Como su nueva ejecución del comando 77 (./generator.sh
) era el comando 83, ahora está en el comando 84, por!-6
lo que volverá a ejecutar el comando 78.!-6
como desee.fuente