Czy mogę łatwo przeszukiwać moją historię w wielu oknach ekranu?

11

Moja obecna screensesja ma 12 otwartych okien. Działa od tygodni ... Wiem, że wykonałem convertkomendę ImageMagick w jednym z tych 12 okien ekranowych w zeszłym tygodniu ... czy jest jakiś sposób na łatwe przeszukanie historii Bash wszystkich 12 instancji, bez ich zamykania lub uruchamiania history | grep convertna wszystkich 12 ekranach?

Josh
źródło
1
Używam zsh i muszę setopt share_historysię /etc/zsh/zshrcwięc tego problemu nie powinno się zdarzyć do mnie: P
phunehehe

Odpowiedzi:

18

Możesz uruchomić history -a; history -cwe wszystkich oknach, aby zapisać historię. A potem history -rgo odświeżyć.

Aby rozwiązać to bardziej trwale, dodaj to do .bashrc:

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
Gert
źródło
2
To wspaniale, dzięki! Jedynym problemem jest to, że jeśli wpiszesz coś w jednej powłoce, a następnie przejdziesz do innej i natychmiast napiszesz historię, nie pojawi się ona w historii. Jest tak, ponieważ PROMPT_COMMAND jeszcze się nie wykonał, więc odświeżenie nie nastąpiło. Najpierw musisz nacisnąć klawisz Return w drugim oknie (lub uruchomić inne polecenie), a następnie wpisać historię.
Javid Jamae,
1

Brzmi trudno. Oto kilka metod, które mogą Ci pomóc.

Jeśli masz zainstalowane narzędzia do rozliczania procesów (w systemie Linux, poszukaj pakietu o nazwie acct) i uprawnienia do ich używania, możesz dowiedzieć się, kiedy i być może na jakim terminalu działałeś convert:

lastcomm convert

Jeśli jest to niedostępne lub niejednoznaczne, możesz wykonać historypolecenie w każdej instancji bash, aby wyszukać convertpolecenia. Znajduje to polecenia, które były w pliku historii, gdy uruchomiono bash.

: >/tmp/convert.history
for w in $(seq 0 11); do
  screen -p $w -X stuff \
    'history | sed 's/^.*convert/'$w'&/" >>/tmp/convert.history
'; done
  • $(seq 0 11)iteruje po liczbie okien ekranu. Pamiętaj, aby pominąć okna, które nie są obecnie uruchomione przez bash, ale jakiś inny proces, który interpretowałby dane wejściowe inaczej.
  • screen -p $w stuff …wysyła następujący ciąg jako dane wejściowe do określonego okna. Potrzebujesz nowej linii na końcu łańcucha.
  • Plik /tmp/convert.historybędzie zawierał listę linii, takich jak 3 convert foo.jpgjeśli uruchomiłeś convert foo.jpgw oknie 3.
Gilles „SO- przestań być zły”
źródło
1
Niestety te nie działały. :-( Właśnie skończyłem działać history | grep convertwe wszystkich oknach. Jestem rozczarowany, chciałem zaakceptować kolejną świetną odpowiedź Gillesa!
Josh
1

tcsh pozwala udostępniać historię między sesjami za pomocą aliasu okresowego.

W pliku .cshrc (lub .tcshrc):

set tperiod = 60 #(or any other number.  Time in minutes between refreshing)
alias periodic 'history -S; echo "Syncing history"'

Spowoduje to automatyczne wykonanie polecenia historii co 60 minut. Spowoduje to zapisanie historii we wspólnym pliku historii w twoim katalogu domowym. Aby częściej aktualizować historię, zmniejsz liczbę okresów lub po prostu uruchom polecenie „okresowe”, aby ręcznie odświeżyć

Michael Toth
źródło
0

Bash zapisuje historię dopiero po wyjściu, co w najlepszym wypadku sprawia problemy. Słyszałem, że zsh może udostępniać historię między aktywnymi sesjami.

bahamat
źródło