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.


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"

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.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.