Uruchom skrypt bash za każdym razem, gdy wykonywane są wiersze poleceń

9

Jestem nowym użytkownikiem Ubuntu / Linux, chciałbym zadać pytanie tak jak mój tytuł powyżej.

Na przykład mam plik bash ./script, chciałbym, aby uruchamiał się automatycznie po wpisaniu dowolnego wiersza polecenia. Raz wykonać wiersz polecenia pwdnastępnie ./scriptzostanie wykonany. Raz wpisać następną linię poleceń ls -lanastępnie ./scriptzostanie ponownie wykonana.

Ender Phan
źródło
4
możemy zapytać: jakie działania zamierzasz wykonać dla każdego wpisanego polecenia? i czy powinno to być tylko dla tych wpisywanych interaktywnie? a także dla dowolnego polecenia w skrypcie? a co z poleceniami wpisanymi w ssh? itp. Może to być XYProblem
Olivier Dulac

Odpowiedzi:

13

Musisz ustawić PROMPT_COMMANDzmienną. Od man bash:

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

Na przykład spowoduje to zapisanie bieżącej daty za /tmp/PCkażdym razem, gdy polecenie zostanie wykonane:

 $ PROMPT_COMMAND="date > /tmp/PC"
Arkadiusz Drabczyk
źródło
1
Tak, mam to ... całkiem fajne rozwiązanie. (przegłosowano)
Ender Phan
1
To jest źle. Polecenie echo $(date)zostanie uruchomione w czasie deklaracji, więc zawsze pokaże (zapisze) ten sam czas.
heemayl
@heemayl: oczywiście masz rację, naprawiłem to
Arkadiusz Drabczyk
@ lộcphan Jeśli jedna z tych odpowiedzi rozwiązała problem, poświęć chwilę i zaakceptuj go , klikając znacznik wyboru po lewej stronie. To oznacza pytanie jako odpowiedź i jest to sposób wyrażania podziękowań na stronach Stack Exchange.
terdon
@heemayl: Dlaczego? ...
Arkadiusz Drabczyk
11

Szukasz PROMPT_COMMANDzmiennej środowiskowej, wartość tej zmiennej zostanie wykonana jako polecenie, po wykonaniu każdego polecenia podanego w terminalu, tuż przed wyświetleniem następnego monitu.

Na przykład ustaw jako:

export PROMPT_COMMAND='/path/to/script'

/path/to/scriptNajpierw wykonaj skrypt .

Teraz skrypt będzie uruchamiany po każdym poleceniu.

Uwaga: jeśli nie chcesz, aby zmienna była eksportowana, tzn. Uczyń ją zmienną powłoki zamiast zmiennej środowiskowej, upuść export:

PROMPT_COMMAND='/path/to/script'

Od man bash:

PROMPT_COMMAND 
If set, the value is executed as a command prior to issuing each primary prompt.
heemayl
źródło
Rozumiem, dziękuję bardzo za pomoc :) (upvoted btw)
Ender Phan
Dlaczego używasz export?
Arkadiusz Drabczyk
@ArkadiuszDrabczyk exportzmieni zmienną PROMPT_COMMANDśrodowiskową, tj. Zmienna będzie dostępna dla wszystkich procesów potomnych (np. Podpowłoki) bieżącej powłoki. Jeśli chcesz ograniczyć go tylko do bieżącej sesji powłoki (zmienna powłoki), usuń export.
heemayl
5
@heemayl: IMO exportnie jest tutaj dobrą praktyką - PROMPT_COMMANDpowinno być ustawione tylko w interaktywnym pliku startowym powłoki i nie powinno być widoczne w środowisku
Arkadiusz Drabczyk