2011-01-03 10 views
21

Chcę uruchomić polecenie, na przykładJak uruchomić jakieś polecenie przed lub po każdym wprowadzeniu polecenia Bash z konsoli?

echo "foobar"; 

Po każdym poleceniu, wpisaną przez użytkownika.

dwa scenariusze:

  • Gdy użytkownik wpisze komendę, moje polecenie globalne powinny być realizowane, a później jego polecenie powinno być wykonane
  • Gdy użytkownik wpisze polecenie, jego polecenie powinno być wykonane, i później moje globalne polecenie powinno zostać wykonane

Jak osiągnąć powyższe dwa scenariusze?

NB: Nie chcę używać zachęty do tego celu (pozostaw zmienną PS1 bez zmian).

+4

@ajreal jak alias? czy powinienem aliasować każde polecenie? – astropanic

+2

Dlaczego nie chcesz użyć oczywistego rozwiązania? Zawsze możesz napisać własną powłokę, która robi to, co chcesz. –

Odpowiedz

15

Zgodnie z sugestią l0b0, możesz użyć drugiej strony, aby uzyskać PROMPT_COMMAND i nie musisz dotykać PS1.

zrobić swoje pierwsze żądanie, można trap się DEBUG pseudo-ostrzegawcze:

trap 'echo "foobar"' DEBUG 
+0

Dla mnie, używając triku pułapek wykonuje kod jeden raz przed i cztery razy po poleceniu. – trusktr

+0

@trusktr: To prawdopodobnie oznacza, że ​​masz ustawioną opcję 'PROMPT_COMMAND' do uruchamiania niektórych poleceń. Niestety, ponieważ pułapka 'DEBUG' jest wykonywana przed uruchomieniem komend, nie można wyłączyć pułapki na początku' PROMPT_COMMAND' i wycofać się na końcu, ponieważ polecenie wyłączenia go uruchomi. –

+0

Yikes. To brzydkie. Próbuję zaimplementować coś, aby moja historia Bash była zsynchronizowana między terminalami, ale bez względu na to, co robię, nie mogę tego zrobić. Pomyślałem, że jeśli istnieje sposób na zaimplementowanie funkcji poprzedzającej polecenie (takiej jak ta pułapka), wówczas mógłbym wymusić odświeżenie historii na podstawie ostatniego polecenia drugiego terminala. Do tej pory znalazłem różne metody, które używają PROMPT_COMMAND do napisania HISTFILE, a następnie odświeżenia historii, ale nie zostanie to odzwierciedlone w innym terminalu, dopóki przynajmniej jedno polecenie nie zostanie wykonane (przynajmniej naciśnięcie klawisza enter). – trusktr

8

Dla drugiej części można użyć declare -r PROMPT_COMMAND="echo 'foobar'": Wykonuje się tuż przed wyświetleniem monitu. Pamiętaj, że nie będzie on uruchamiany dla każdego polecenia, na przykład potoku lub grupy poleceń.

Pamiętaj, że każde rozwiązanie tego problemu może narobić bałaganu dla użytkownika, więc najlepiej zadzwoń do komend, które niczego nie wyprowadzają (w przeciwnym razie obsługa wyjścia jest praktycznie niemożliwa) i które nie są dostępne dla użytkownika (aby uniknąć fałszowania lub zniekształcania danych wyjściowych).

+0

Zalecam, aby nie był on tylko do odczytu. Możesz także wyeliminować escaping: '... = 'echo" foobar "'' –

+0

Być może jest to oczywiste, ale to nie uruchamia globalnego polecenia zaraz po wejściu użytkownika; najpierw czeka na zakończenie polecenia użytkownika. –

Powiązane problemy