Unikaj utrzymywania dowodzenia w historii

33

Używam bash i chciałbym uniknąć przechowywania niektórych poleceń w historii.

  • Czy można to zrobić tylko dla następnego polecenia?
  • Czy można to zrobić dla całej sesji?
Luc M.
źródło
Zauważ, że jeśli celem jest ukrycie haseł w argumentach wiersza poleceń, będą one nadal widoczne przez ps
Benitok

Odpowiedzi:

36

i właśnie przypomniałem sobie inną odpowiedź, ta jest faktyczną odpowiedzią na twoje pytanie.

jeśli masz „ignorowanie” w HISTCONTROL, to bash nie zapamięta żadnej linii rozpoczynającej się spacją. nie pojawi się nawet w bieżącej historii powłoki, nie mówiąc już o zapisaniu do $ HISTFILE.

np. mam eksport HISTCONTROL = 'ignoreboth: erasedups' w moim ~ / .bashrc

oto szczegóły ze strony man bash:

HISTCONTROL
  Rozdzielona dwukropkami lista wartości kontrolujących działanie poleceń
  zapisane na liście historii. Jeśli lista wartości zawiera
  bez względu na to, wiersze zaczynające się od znaku spacji nie są
  zapisane na liście historii. Wartość zignorowanych powoduje linie
  dopasowanie do poprzedniego wpisu historii, aby nie zostać zapisane. Wartość
  ignoreboth jest skrótem od ignorowania i ignorowania. Wartość
  z wymazanych powoduje, że wszystkie poprzednie linie pasują do bieżącej linii
  do usunięcia z listy historii przed zapisaniem tego wiersza.
  Wszelkie wartości niewymienione na powyższej liście są ignorowane. Jeśli HISTCONTROL jest
  unset lub nie zawiera poprawnej wartości, wszystkie linie odczytywane przez
  parser powłoki jest zapisywany na liście historii, z zastrzeżeniem wartości
  HISTIGNORE. Druga i kolejne linie wielu linii
  złożone polecenie nie jest testowane i są dodawane do historii
  niezależnie od wartości HISTCONTROL.
cas
źródło
1
+1 za lewę kosmiczną: D
petrus
19

Oto kilka lekcji historii, które wyciągnąłem z Google:

Możesz ustawić historię tak, aby ignorowała niektóre ciągi. W tym przykładzie zignorowałem polecenia ls, passwd i wszelkie polecenia poprzedzone spacją znaków.

export HISTIGNORE = "ls: passwd:"

Aby wyłączyć historię sesji, możesz wydać:

eksport HISTSIZE = 0

Odniesienie

Michael Havas
źródło
7

Jeśli chcesz tylko usunąć ostatnie polecenie z historii, możesz nacisnąć Up-arrow, a następnie Ctrl - U(usunąć do początku wiersza), a następnie Up-arrowponownie.

Możesz usunąć dowolną pojedynczą linię z historii w ten sposób. Wystarczy użyć strzałki w górę, wyszukiwania lub cokolwiek Ctrl - U, aby ustawić bieżący edytowany wiersz poleceń, a następnie nacisnąć , a następnie Up-arrowlub, Down-arrowaby przejść do innej linii historii.

Odkryłem to przypadkiem przed laty. Nie mam pojęcia, czy jest to udokumentowane, czy nie.

Zasadniczo jednak łatwiej jest nie zapisywać historii bieżącej powłoki za pomocą:

HISTFILE=/dev/null
cas
źródło
3

Możesz rozbroić HISTFILEzmienną. Od man bash:

  HISTFILE
         Nazwa pliku, w którym zapisana jest historia poleceń (patrz JEGO-
         TORY poniżej). Wartość domyślna to ~ / .bash_history. Jeśli nie jest ustawiony,
         historia poleceń nie jest zapisywana, gdy powłoka interaktywna
         wychodzi.

Nie sądzę, żeby to zapobiegało pojawianiu się polecenia w lokalnej historii powłoki przed zamknięciem powłoki.

Greg Hewgill
źródło
2

Czasami tak robię

export HISTFILE=/dev/null
Rory
źródło
1

Widzę, że nikt nie napisał tej metody, więc zrobię to.

history -d $((HISTCMD-1)) && history -d <command or number of command>

history -d usuwa wspomniany wpis z historii.

HISTCMDprzechowuje numer komendy, która ma zostać wykonana w następnej kolejności. Tak więc (HISTCMD-1) odnosi się do ostatnio wykonanego polecenia.

Zrobiłem krótki film bash, który pokazuje, jak to działa: https://asciinema.org/a/dtxpuovhty0obhln50soqypt2

Po uruchomieniu polecenia i ponieważ usuwa ono również samo polecenie, przejście w górę ze strzałką nie spowoduje wyświetlenia polecenia, więc jeśli planujesz często go używać, najlepiej byłoby utworzyć alias:

alias hc='history -d $((HISTCMD-1)) && history -d $1'

Następnie możesz zrobić:

$ hc command
Itai Ganot
źródło