2011-01-03 13 views
21

Quiero ejecutar un comando, por ejemplo¿Cómo ejecutar algún comando antes o después de cada comando Bash ingresado desde la consola?

echo "foobar"; 

Después de cada comando, introducido por el usuario.

dos escenarios:

  • Cuando el usuario introduce un comando, mi orden mundial debe ser ejecutado, y más tarde su comando debería ser ejecutado
  • Cuando el usuario introduce un comando, el comando debería ser ejecutado, y más tarde mi comando global debería ejecutarse

¿Cómo lograr los dos escenarios anteriores?

NB: No quiero utilizar el aviso para este propósito, (deje la variable PS1 como está).

+4

@ajreal, cómo alias? ¿Debería alias cada comando? – astropanic

+2

¿Por qué no quiere usar la solución obvia? Siempre puedes escribir tu propio caparazón que haga lo que quieras. –

Respuesta

15

Como l0b0 sugiere, puede usar PROMPT_COMMAND para hacer su segunda solicitud y no tendrá que tocar PS1.

Para hacer su primera solicitud, puede trap la DEBUG señal de pseudo-:

trap 'echo "foobar"' DEBUG 
+0

Para mí, usar el truco trampa ejecuta el código una vez antes y cuatro veces después del comando. – trusktr

+0

@trusktr: Eso probablemente significa que tienes 'PROMPT_COMMAND' configurado para ejecutar algunos comandos. Desafortunadamente, como la trampa 'DEBUG' se ejecuta antes de que se ejecuten los comandos, no puedes desactivar la trampa al comienzo de tu' PROMPT_COMMAND' y retroceder al final porque el comando para desactivarlo lo activará. –

+0

Yikes. Eso es feo. Estoy tratando de implementar algo para que mi historial de Bash se sincronice entre terminales, pero no importa lo que haga, no puedo hacerlo realidad. Pensé que tal vez si hay una manera de implementar una función de precomando (como este ejemplo de trampa), entonces podría forzar la actualización del historial en función del último comando de la otra terminal. Hasta ahora, he encontrado varios métodos que usan PROMPT_COMMAND para escribir en HISTFILE y luego actualizar el historial, pero esto no se ve reflejado en otro terminal hasta que se ejecute al menos un comando (al menos presionar Enter una vez). – trusktr

8

Para la segunda parte puede usar declare -r PROMPT_COMMAND="echo 'foobar'": Se ejecuta justo antes de que se muestre el aviso. Tenga en cuenta que no se ejecutará para cada comando, por ejemplo, en una tubería o grupo de comandos.

Tenga en cuenta que cualquier solución tiene el potencial de complicar las cosas para el usuario, por lo que lo ideal es llamar a comandos que no producen nada (de lo contrario, cualquier gestión de salida es prácticamente imposible) y que no están disponibles para el usuario (para evitar que falsifiquen o corrompan la salida).

+0

Yo recomendaría que no sea de solo lectura. Además, puede eliminar el escape: '... = 'echo' foobar '' ' –

+0

Quizás sea obvio, pero esto en realidad no ejecuta el comando global justo después de que el usuario presione enter; primero espera que termine el comando del usuario. –

Cuestiones relacionadas