Aby zapobiec rejestrowaniu „niebezpiecznych” poleceń w historii bash, dodałem do mojego .bashrc
pliku następujący wiersz :
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
działa to dobrze, ale ma efekt uboczny: nie widzę pełnej historii poleceń wykonywanych na komputerze. Powiedzmy, że mam kilka maszyn do eksperymentów i chcę widzieć wszystkie wykonywane polecenia. Użyłbym bash wewnętrznego history
do wyświetlenia wykonanych poleceń i być może grep dla dzisiejszej daty:
history | grep Sep-28
Chciałbym również rejestrować „niebezpieczne” polecenia, ale umieszczać je #
na początku wiersza, aby w razie przypadkowego wykonania polecenia z historii przez pomyłkę nie doszło do żadnych szkód.
Nie mam pojęcia, czy to możliwe.
Aktualizacja i wyjaśnienie:
Głównym powodem, dla którego jest to dla mnie problem, jest to, że zwykle jestem podłączony do mojej maszyny z kilku terminali, a każde polecenie wykonane na jednym terminalu jest natychmiast odczytywane w historii innych terminali. Osiąga się to przez
PROMPT_COMMAND="history -a; history -c; history -r"
Wyobraźmy sobie, że mam otwarte dwa terminale. W jednym mam jakiś cat /dev/foo > file.out
proces. W drugim sprawdzam postęp za pomocą ls -lAhF
. Powtarzam ls
, naciskając Upi ENTER(czyli ostatnie polecenie z historii). Zaraz po zakończeniu pierwszego polecenia ostatnie polecenie z historii nie jest już ls
, ale cat /dev/foo > file.out
. Jeśli nie będę ostrożny, uruchomię ponownie kota i zastąpię plik.out.
Chciałbym, aby polecenie kota było poprzedzone znakiem „a” #
, aby nie zostało wykonane. Wciąż jednak widziałbym go w historii i mogę go ponownie użyć (jeśli jest to długie polecenie), nie komentując go.
źródło
watch ls -lAhF
lubwhile sleep 1; do ls -lAhf; done
; zamiast oglądać rozmiar pliku, możesz użyćpv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ).Odpowiedzi:
Możesz zrobić coś takiego:
Chodzi o to, że przed każdym monitem sprawdzamy ostatni wpis historii (
history 1
), a jeśli jest to jeden z niebezpiecznych , usuwamy go (history -d
) i dodajemy z powrotem za#
pomocąhistory -s
.(oczywiście musisz usunąć swoje
HISTIGNORE
ustawienie).Niepożądany efekt uboczny, że choć jest to, że zmienia się czas historię tych
rm
,mv
... polecenia.Aby to naprawić, alternatywą może być:
Tym razem rejestrujemy czas ostatniej historii, a aby dodać linię historii, używamy
history -r
z pliku tymczasowego (dokument tutaj), który zawiera znacznik czasu.Chciałbyś, żebyś
fixhist
to zrobił przed swoimhistory -a; history -c; history -r
. Niestety obecna wersjabash
ma błąd,history -a
który nie zapisuje tej dodatkowej linii, którą dodaliśmy. Rozwiązaniem jest napisanie go zamiast tego:Oznacza to, że sami dodamy komentowane polecenie do HISTFILE, zamiast pozwolić
history -a
na to.źródło
cmd=${cmd#*[0-9] }
robi? I gdzie dokładnie należy umieścićfixhist
w moimPROMPT_COMMAND
? W tej chwili zawiera jużPROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? Już ustawiłemexport HISTTIMEFORMAT="%b-%d %H:%M "
. Nawiasem mówiąc, kiedy dodam twój kod do mojego$HOME/.bashrc
, nic się nie dzieje.HISTTIMEFORMAT=/
jest tylko dla tego jednego wywołania,history
aby uzyskać wynik, np.123 /rm x
tam, gdzie łatwiej jest wyodrębnić cmd. Wystąpił problem z niektórymi wersjamibash
gdzie$HISTCMD
był podrobiony w tym kontekście wypróbować nową wersję.#
kod nie działa jako komentarz.bashrc
?bash
wstawia*
po numerze numer, którego nie oczekiwano. Powinien zostać teraz naprawiony.Nie zamierzam dokładnie odpowiedzieć na twoje pytanie, ale może dam alternatywne rozwiązanie twojego problemu.
Jeśli dobrze rozumiem, martwisz się błędami, które możesz popełnić, pisząc np.
!rm
Jeśli zdarzyło się, że poprzednierm
polecenie w historii usuwa coś, co chciałbyś zachować.W tym przypadku fajną opcją jest bash
histverify
. Jeśli tyshopt -s histverify
i jeśli przywołasz polecenie z hukiem!
, nie zostanie ono wykonane natychmiast, ale zostanie załadowane do linii odczytu, abyś mógł albo zdecydować się je wykonać, albo nie, a to również daje możliwość edycji.Spróbuj:
Bez
histverify
:Z
histverify
:W takim przypadku kursor będzie znajdować się na końcu wiersza, gotowy do ponownego uruchomienia - lub nie - lub do edycji.
Jeśli podoba ci się ta opcja, umieść ją w
.bashrc
:źródło