Polecenie przed każdym poleceniem bash

18

Czy ktoś zna sposób umieszczania polecenia „time” przed każdym poleceniem w sesji bash?

jthoenes
źródło
1
więc ... chcesz automatycznie dodawać „czas” do każdej linii poleceń?
quack quixote
1
tak, wspaniale ... oczywiście, jeśli chodzi o wyniki
jthoenes,

Odpowiedzi:

37

Przepraszam za złą odpowiedź wcześniej, nie rozumiem twojego pytania.

Aby dodać czas przed każdym poleceniem wykonanym w powłoce, możesz zrobić coś takiego

bind 'RETURN: "\e[1~time \e[4~\n"'

Spowoduje to ponowne powiązanie klawisza Return. Teraz za każdym razem, gdy naciśniesz klawisz powrotu zamiast pisania nowego wiersza \ n, przejdzie on na początek wiersza, wprowadzi tekst „czas” i spację, przejdzie na koniec wiersza i wprowadzi nowy wiersz \ n, tworząc w ten sposób pożądany efekt.

Jeśli nie chcesz poświęcać swojego klawisza Enter, możesz utworzyć „drugi” klawisz porównawczy, np. F12, wiążąc polecenie w ten sposób

bind '"\e[24~": "\e[1~time \e[4~\n"'

Teraz zamiast zastępować klawisz powrotu, związałeś F12.

Tłem tego wszystkiego jest to, że bash używa polecenia readline GNU do odczytu poleceń. Tak więc readline byłby dobrym punktem wyjścia do dalszej manipulacji poleceniami itp.

Lukas Loesche
źródło
1
+1 fajne rozwiązanie! Podobał mi się pomysł oddzielenia klawisza Enter testu porównawczego od zwykłego klawisza Enter.
quack quixote
to sprytny pomysł. Jak możesz go uogólnić, aby wykonać funkcję zdefiniowaną przez użytkownika przed każdą komendą? Nie wiem, jak połączyć kod bash i funkcję readline w tym samym powiązaniu.
Gilles 'SO - przestań być zły'
Czy to nie będzie działać na Macu? Uruchomiłem polecenie w terminalu i mój klawisz Enter wydaje się teraz nic nie robić.
akki
6

Zdaję sobie sprawę, że to nie wchodzi w zakres tego pytania, ale ...

W zsh(co, według mojej wiedzy, to super zestaw bash), jeśli ustawisz następującą zmienną w swoim .zshrcpliku:

export REPORTTIME=5

Każde polecenie, które trwa dłużej niż 5 sekund (jestem całkiem pewien) wyświetli wynik time. Nie wszystkie polecenia, które szybciej się wypełniają. I w takich przypadkach tak naprawdę to nie obchodzi, więc miło jest nie zaśmiecać rzeczy. Istnieje również wiele innych fajnych funkcji zsh, które mogą ci się spodobać, gdy jesteś przy nim.

tychoish
źródło
Dobra wskazówka. Chociaż zsh ma z pewnością nadzbiór funkcjonalności bash , jego składnia nie jest nadzbiorem składni bash , więc nie jest to zamiana „drop in”.
Chris Johnsen,
1

Uwzględnij \ t w ciągu zachęty. Będzie zawierać czas w monicie w punkcie, w którym go podałeś. Zobacz: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

JRobert
źródło
Jest to aktualny czas w chwili generowania monitu, a nie czas potrzebny na wykonanie poprzedniego polecenia.
Wstrzymano do odwołania.
Prawdziwe; a różnicą między tym a bieżącym czasem następnego monitu jest czas wykonywania (oczywiście minus czas pisania) - wklejanie tutaj jest twoim przyjacielem). Nie są konieczne zmiany przypisania.
JRobert
0

PS1 wydaje się standardowym sposobem na zrobienie czegoś takiego.

Jason Sundram
źródło
2
Zmienia wyświetlanie, a nie faktycznie wykonane polecenie.
user1686,
@grawity Racja - ale dostaniesz dokładnie to, czego chcesz ... czas przeznaczony na każdą linię.
Jason Sundram,
3
Co jest całkowicie odmienne od tego, co timerobi (mierzy, ile czasu zajęło wykonanie polecenia).
user1686,
@grawity, myślę, że masz rację - będziesz musiał sam odjąć. Wygląda na to, że @Jrobert miał ten sam pomysł.
Jason Sundram