„Historia” przestaje działać po uruchomieniu w skrypcie bash

9

Piszę prosty skrypt, aby przeglądać moją historię bashów w celu znalezienia określonego ciągu. W wierszu polecenia mogę wykonać następujące czynności, które działają dobrze:

history | grep git

Jednak gdy tworzę skrypt bashowy za pomocą tego samego polecenia co powyżej, nagle historynic nie zwraca:

#!/bin/bash
history | grep git

Kiedy usuwam pierwszy wiersz #!/bin/bash, mój skrypt działa ponownie. Co tu się dzieje? Jak mogę używać historyw skrypcie bash?

Martin Vegter
źródło

Odpowiedzi:

8

Poniżej podano bash 4.0 or higher only, ale załatwia sprawę. :)

#!/bin/bash -i
history | grep sometext

Pracuje! Wypróbuj to. ( -i= Ja nteractive, flaga nie dostępne do bash 3.x i wcześniej)

błąd składni
źródło
Dziękuję również kolesiu, który ostatnio przegłosował mnie tylko dlatego, że może. (Prawdopodobnie bashużytkownik v3, z samej frustracji, haha). Przynajmniej dla Martina moje rozwiązanie było bardzo pomocne, to (przynajmniej) komfort.
składniaerror
Miałem to samo pytanie, kiedy pisałem narzędzie, które rejestruje pracę po godzinach pracy dla inżynierów wsparcia 24/7 .. dzięki!
Henry van Megen
14

Po uruchomieniu skryptu powłoki bash, na przykład poprzez uruchomienie pliku wykonywalnego, którego linia shebang jest #!/bin/bash, skrypt jest uruchamiany w nieinteraktywnej powłoce. Jedną z cech nieinteraktywnej powłoki jest wyłączenie historii. Jeśli więc chcesz, aby skrypt mógł korzystać z historii, musisz zrobić coś takiego:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Oczywiście w tym przypadku mógłbyś właśnie zrobić:

grep git ~/.bash_history

Ponieważ oba powyższe wymagają, aby plik historii ( ~/.bash_history) był aktualny, co prawie na pewno nie będzie.

Nie jestem pewien, jak uruchamiasz skrypt po usunięciu linii shebang. Pozyskanie pliku (np. Z .) nie jest tym samym, co uruchomienie skryptu, ponieważ polecenia działają w bieżącej powłoce, która ma włączoną historię.

rici
źródło
Co powiesz na wykonanie history -azaraz po poleceniu set, aby upewnić się, że ostatnie polecenia są najpierw dołączane do pliku?
4
@ illuminÉ: nie pomoże. Powłoka zaczęła uruchamiać skrypt jest procesem całkowicie trudnym; zaczyna się od pustej historii frsh.
rici