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.


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"

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.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.