Execute o script bash sempre que as linhas de comando forem executadas

9

Sou um novo usuário do Ubuntu / Linux, gostaria de fazer uma pergunta como meu título acima.

Por exemplo, eu tenho um arquivo bash ./script, gostaria de executá-lo automaticamente quando digitar qualquer linha de comando. Depois de executar a linha de comando pwd, o comando ./scriptserá executado. Depois de digitar a próxima linha de comando ls -la, o comando ./scriptserá executado novamente.

Ender Phan
fonte
4
podemos perguntar: que tipo de ação você pretende executar em cada comando digitado? e deve ser apenas para aqueles digitados interativamente? ou também para qualquer comando em um script? e quanto aos comandos digitados sobre ssh? etc. Este pode ser um XYProblem
Olivier Dulac

Respostas:

13

Você precisa definir a PROMPT_COMMANDvariável. De man bash:

PROMPT_COMMAND
              If set, the value is executed as a command prior to
              issuing each primary prompt.

Por exemplo, isso escreverá a data atual /tmp/PCtoda vez que um comando for executado:

 $ PROMPT_COMMAND="date > /tmp/PC"
Arkadiusz Drabczyk
fonte
11
Sim, eu entendi .. solução muito legal. (upvoted)
Ender Phan
11
Isto está errado. O comando echo $(date)será executado no momento da declaração; portanto, sempre será exibido (salvo) ao mesmo tempo.
heemayl
@heemayl: é claro que você está certo, eu
consertei
@ lộcphan Se uma dessas respostas resolver seu problema, reserve um momento e aceite-o clicando na marca de seleção à esquerda. Isso marcará a pergunta como respondida e é assim que os agradecimentos são expressos nos sites do Stack Exchange.
terdon 3/16
@heemayl: Por quê? ...
Arkadiusz Drabczyk
11

Você está procurando PROMPT_COMMANDuma variável de ambiente, o valor dessa variável será executado como comando, após a execução de cada comando fornecido no terminal, pouco antes de mostrar o próximo prompt.

Por exemplo, defina-o como:

export PROMPT_COMMAND='/path/to/script'

Torne o script /path/to/script, executável primeiro.

Agora o script será executado após cada comando.

Apenas para observar, se você não deseja que a variável seja exportada, ou seja, torne-a uma variável de shell em vez de uma de ambiente, solte export:

PROMPT_COMMAND='/path/to/script'

De man bash:

PROMPT_COMMAND 
If set, the value is executed as a command prior to issuing each primary prompt.
heemail
fonte
Eu tenho isso, muito obrigado pela vossa ajuda :) (upvoted btw)
Ender Phan
Por que você está usando export?
Arkadiusz Drabczyk
O @ArkadiuszDrabczyk exporttornará a variável PROMPT_COMMANDuma variável de ambiente, ou seja, a variável estará disponível para todos os processos filhos (por exemplo, subshells) do shell atual. Se você deseja limitá-lo apenas à sessão atual do shell (variável do shell), remova export.
precisa saber é
5
@heemayl: IMO exportnão é uma boa prática aqui - PROMPT_COMMANDsó deve ser definido em um arquivo de inicialização shell interativo e não deve ser visível no ambiente
Arkadiusz Drabczyk