echo $HISTSIZE

Címkék

Mekkora a shell history a leggyakrabban használt gépeden, vagy környezetben?

bash, dash alatt az "echo $HISTSIZE" parancs mondja meg, Windows PowerShell-ben (állítólag) a $MaximumHistoryCount változó

0 - 99
2% (8 szavazat)
100 - 999
14% (58 szavazat)
1000 - 9999
43% (179 szavazat)
10000 - 99999
15% (60 szavazat)
>= 100000
10% (41 szavazat)
< 0
2% (8 szavazat)
üres, nincs ilyen változó
2% (10 szavazat)
nem bash-t, dash-t, vagy hasonlót használok
2% (10 szavazat)
Tessék?
9% (39 szavazat)
Összes szavazat: 413

Hozzászólások

Powershellt nem használok. Bashban és zsh-ban 1000 volt mindig is a historym, ez az alapbeállítás a legtöbb disztróban és nem volt rá okom, hogy megváltoztassam ,eddig mindig bőven elég volt. Meglepő, hogy mennyire egyenlően oszlanak meg a szavazók a 100, 1k, 10k, 100+k között. Csökkenteni szerintem nincs sok értelme 1000-ről, sokat enni nem kér. Ilyen indokkal 1000 fölé is emelhető, de ~10k fölött szerintem azért nincs értelme, mert már nem áttekinthető, olyan messzire ki keres vissza, akár csak Ctrl+R kombóval?

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Nem tudom, hogy a laptopom amin dolgozom mennyire számít üzemeltetett eszköznek olyan értelemben ahogy az üzemeltetői mondás tartja, de ennek ellenére még valahogy sose volt abból gondom, hogy melyik megoldás az ami nem jó :) Cserébe ott van, gyors és fájdalommentes :)

Az fzf-et én is ismerem, számos scriptem használja, meg Vifm-be és vim-be is bekötöttem, szóval intenzíven használom az fzf-et a shellbe és inputrc-be bedrótozott vi mód mellett. De azt nem tudtam, hogy Ctrl+R-re is beköthető, ezt leírnád hogyan lehet?

Jelenleg zsh-t használok, de nem jön be, a tabos kiegészítése nem mindig ismer fel dolgokat, pedig az autocompletion-ben minden lehetséges opció be van kapcsolva, és a szükséges csomagok is mind fent vannak hozzá. Meg a zsh behányja parancsnak átadott url-re, hogy nem található, csak úgy jó, ha az url-t idézőjelek közé zárom. Ezek miatt az idegesítő dolgok miatt lehet visszaállok bash-re.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

En meg csak history es fajl keresesre hasznalom, szinten zsh. Installnal beallitott maganak mindent, ha azt kihagytad, akkor szerintem le lehet ujra futtatni:

https://unix.stackexchange.com/questions/534942/auto-trigger-history-se…

 

Nalam igy nez ki az .fzf.zsh, es a key-bindingsbol a relevans resz:

# Setup fzf
# ---------
if [[ ! "$PATH" == */usr/local/opt/fzf/bin* ]]; then
  export PATH="${PATH:+${PATH}:}/usr/local/opt/fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/usr/local/opt/fzf/shell/completion.zsh" 2> /dev/null

# Key bindings
# ------------
source "/usr/local/opt/fzf/shell/key-bindings.zsh"

key-bindings:

# CTRL-R - Paste the selected command from history into the command line
fzf-history-widget() {
  local selected num
  setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
  selected=( $(fc -rl 1 | perl -ne 'print if !$seen{($_ =~ s/^\s*[0-9]+\s+//r)}++' |
    FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
  local ret=$?
  if [ -n "$selected" ]; then
    num=$selected[1]
    if [ -n "$num" ]; then
      zle vi-fetch-history -n $num
    fi
  fi
  zle reset-prompt
  return $ret
}
zle     -N   fzf-history-widget
bindkey '^R' fzf-history-widget

} always {
  eval $__fzf_key_bindings_options
  'unset' '__fzf_key_bindings_options'
}

Mármint pontosan mi állított micsodát, honnan telepítve? Nálam ez a kódrészlet nem működik, hiányolja a __fzfcmd változót.

Egyelőre így oldottam meg magamnak, közvetlenül a ~/.zshrc fájlból meghívva:

fzf-history-widget() {
  num=$(fc -lr 0 | fzf | awk '{ print $1}')
  if [ -n "$num" ]
  then
    zle vi-fetch-history -n $num
  fi
  return 0
}

zle     -N   fzf-history-widget
bindkey '^R' fzf-history-widget

Így működik. A kiválasztás után nem a history-ban lévő parancsot futtatja, hanem csak beteszi a parancsszerkesztőbe, mert lehet nem akarom változatlan formában futtatni.

Szerk.: á, megvan. Az fzf állítja be telepítéskor, de csak akkor, ha a git repójából telepíted. Ha a disztró csomagkezelőjével teszi fel valaki az fzf-et, ahogy én, akkor nem kínál fel ilyen opciót. Mindegy, nem telepítem, mert már megoldottam magamnak más úton.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Visszaváltottam zsh-ról Bash-ra. Idegesített, hogy idézőjelezni kell a parancsokban az URL-eket, meg nem működött az LS_COLORS se! Plusz a Bash soványabb, mint a zsh és normálisan használja a readline-t, utóbbi nagy segítség sok terminálos programnál, főleg interpretereknél, pl. bc, calc, python, stb., amiket terminálos számológépként és matekprogramként használok. Ezekbe sokkal gyorsabb számítást, komplett műveletsort beverni gépírva, billentyűzetről, mint a GUI-s számológépekben szerencsétlenkedni.

Ha valakit érdekel, a fenti fzf-es Ctrl-R historykeresés Bash alatt így néz ki a ~/.bashrc fájlban:

bash-history-widget() {
  output=$(fc -lr 1 $HISTSIZE | fzf | awk -F '\t' '{ print $2}')
  if [ -n "$output" ]; then
    READLINE_LINE=${output/# /}
    READLINE_POINT=0x7fffffff
  fi
}

bind -m vi-command -x '"\C-r": bash-history-widget'
bind -m vi-insert -x '"\C-r": bash-history-widget'

Lényegében ugyanúgy működik, az fc parancs kilistázza az egész history-t, sorszámokkal és parancsokkal, sajnos a sorszámokat mindenképp beleteszi. Az fzf ebből a listából választ, majd az awk levágja a sorszámot. Ha a kimenet nem üres, azaz a user választott valamit, akkor readline-nak átadjuk az fzf kimenetét, persze az elejére valami miatt betesz egy szóközt, ezt a /# / résszel lecseréljük a nagy semmire. A readline point-os rész meg arra való, hogy a kurzort odapozicionáljuk a history-ból előhívott parancs legvégére, a -1 értéknek felel meg, csak ilyen haxadecimális, túlcsordulásos érték. Ami eltérés van a zsh-s megoldáshoz képest, hogy Bash alatt nem a zle, hanem readline intézi ugyanezeket, változók módosítását igényli, meg van benne ez a beszúrok az elejére egy üres szóközt című furcsaság, amit vissza kell csinálni. Ezt leszámítva jól működik, ugyanolyan jól, mint zsh alatt. Egyébként amit zsh-ban be lehet lőni, parancsszínezés, kiegészítés, stb., azokat Bashban és readline-ban, ~/.inputrc-ben is be lehet ugyanúgy állítani, kb. 99%-os egyezésre, viselkedésűre. Ha valaki nem használ vi-módot, akkor emacs-standard paraméterrel kell beállítani a bind-et.

Elvileg ezt az fzf-es keresést az fzf beteszi telepítéskor kicsit más formában, de csak akkor, ha valaki az fzf git tárolójából telepíti. Ha a disztró tárolójából teszi fel az ember, akkor a .bashrc, meg a .zshrc kézi szerkesztést igényel, ehhez kellenek a fentebb közzétett kódrészek.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

"pl. bc, calc, python, stb., amiket terminálos számológépként és matekprogramként használok. Ezekbe sokkal gyorsabb számítást, komplett műveletsort beverni gépírva, billentyűzetről, mint a GUI-s számológépekben szerencsétlenkedni."

 

Sok plussz-plussz!

Valamint ezekben van history.  Eddig főleg python-t használtam (mobilon is termux-ban). Annak egyetlen baja van: bonyolultabb számítást "import math"-al kell kezdeni. Szerencsére ott is van Ctrl-R :)

nyos@shodan:~$ cat .pythonstartup
import math
import numpy as np
nyos@shodan:~$ export PYTHONSTARTUP=/home/nyos/.pythonstartup 
nyos@shodan:~$ python3
Python 3.6.9 (default, Jan 26 2021, 15:33:00) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> np.array([12,34])
array([12, 34])

En is szeretem szamologepnek hasznalni. :)

A strange game. The only winning move is not to play. How about a nice game of chess?

Én gyakran használom a `history | grep cmd | grep valami_jellemzo_cmdline_argument` patternt a Ctrl-R helyett. Sokat tud segíteni ha valami olyasmit keresek ami nem mostanában volt vagy bonyolult a parancssor vagy csak nem emlékszem fejből valamelyik paraméter pontos értékére stb. Ha gyakran kell futtatni akkor készítek rá scriptet, de ezt előre nem mindig lehet tudni. A Ctrl-R-t csak akkor szoktam használni ha az adott sessionben akarok keresni.

~ $ echo "$HISTSIZE"
5000000

Enni nem kér sokat, nem lassítja a munkát egyáltalán.

En is valami hasonlot szoktam ha tobbszor volt ugyanaz a command (kis kulonbseggel) es nem vagyok benne biztos melyik a helyes varians akkor en igy szoktam:

`history | grep cmd -A10 -B10` 

Igy megkapom a command elotti es utani 10 masik commandot is es igy, hogy van context altalaban mar tudom, hogy melyik verzio volt azt amivel tovabb jutottam. :D

Nalam a HISTSIZE 1000000, ebbol most laptopon olyan ~737000, desktopon meg ~618000 van hasznalva. Nekem mintha 500 remlene bash defaultnak, de az valami katasztrofa, mar a 2 nappal ezelotti commandok sincsenek benne, szerintem meg azt meg azokban az idokben talaltak ki amikor meg kilobyteban mertek a memoriat es megabyteban a HDD-ket es nem tunt fel nekik hogy kozbe eltelt vagy 20 ev.

Es igen, mielott valaki megkerdezi, mar tobbszor jol jott hogy ki tudtam keresni evekkel korabban lefuttatot parancsokat. Van vagy 20 MB a bash_history-m, nem tudom memoria hasznalatban ez mennyit jelent, de idaig meg sose volt gond vele (egy browser magaban tobb ramot eszik kb mint 10 bash).

I hate myself, because I'm not open-source.

Szerkesztve: 2021. 07. 20., k – 10:02

Hoppá, most veszem észre, hogy egyet elrontottam: akinek pont 100000 a history-ja, azt kérem, jelölje be a "> 100000" opciót. Értelemszerűen ott ">=" kellene legyen.

Szerk.: köszi a javítást!

Egyéb: végtelen. Még egyetemista koromban írtam egy kis izét ami felülírja a BASH PROMPT_COMMAND -ot úgy hogy az azonnal beleappendolja a kiadott parancsot egy fájlba aminek a nevében az adott nap dátuma megvan. Ez a home-omban van egy mappában, amit mindig költöztetek ha új a gépre teszek szert.

Így aztán minden kiadott bash parancs megvan 15 évre visszamenőlegesen, ami egyrészt néha hasznos, másrészt roppant szórakoztató. Másik előnye, hogy ha behal/kilövöm a terminált akkor nem veszik el ez a history. Nem emlékszem már a use case-re de akkor ez jól jött valamiért.

https://github.com/mheder/hse

szintén zenész.
én PROMPT_COMMAND-ban mentem le mindig az előző parancs start, end time-ját, PIPESTATUS-át és cwd-jét egy fájlba és a ctrl-R -t egy fzf alapú szkriptre van bindolva amivel bele tudok keresni ebbe az extended bash history-ba. az fzf nem tud sortörést így a hosszú parancsok az fzf preview paneljában vannak ott teljesen.

példa:
2021-07-20 16:23:21 uname | rev # 0|0 0s /tmp

ez a preview paraméter:

--preview='echo {} | bash -c bash_extended_history_colorize | fold -s -w $FZF_PREVIEW_COLUMNS

a "{}" az ugye az aktuális sor amin állok (parancs, dátum, idő, stb),
a bash_extended_history_colorize az ANSI kódokkal kiszinezi úgy ahogy a sima list részben is ki vannak szinezve.
a fold meg feltördeli egész szavak határán.

:)

Benne van még a bash -ben az a race condition error, hogy ha egyszerre zársz be több bash logint (pl. gnome terminal tabok közös X-el kinyirása) akkor a teljes history ugrik? :)

Régi kedvencem.

Amúgy 500.

Ures, nincs ilyen valtozo. Meg valamikor evekkel ezelott beallitottam egy SO topic alapjan, hogy ne torlodjon, es uj rendszereken telepites utan az egyik elso dolog, amit beallitok. Regi szokasom, hogy kommentbe beleirom, hogy mi alapjan allitottam be (ill. sokszor azt is, hogy en modositottam azt a reszt), ez alapjan aki jobban utana akar menni, megteheti.

#http://stackoverflow.com/questions/9457233/unlimited-bash-history
# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

A masik az .inputrc, ebbol a kovetkezo ket bejegyzes az erdekes:

# page up
"\e[5~":  history-search-backward
# page down
"\e[6~":  history-search-forward

"Keresni" ugy szoktam benne, hogy elkezdem irni, es pgup-ot nyomok.

A strange game. The only winning move is not to play. How about a nice game of chess?

fisht használok, ott beégetett 256k van (ami egyébként dedupolt)

Szerkesztve: 2021. 07. 20., k – 19:43

minden parancsot így írok be:
id@nopara:~# unset HISTFILE ; command

viccet félretéve, distro default, de most hogy végigpörgettem az 1000-et nem lenne hülyeség a sokkal több.

nincs aláírásom

Szerkesztve: 2021. 07. 20., k – 23:09

Sima, vagy root userként, vagy összesen? :)

Zsh-t használok, szerintem ezt az értéket defaulton hagytam, még minden megvolt, ami kellett.

"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." John F. Woods

Mostanában leggyakrabban zsh-t használok macOS-en, abban 2000. A poén kedvéért megnéztem a munkahelyi Windowsomon:

  • CMD + Clink (clink set history_file_lines): 10000
  • PowerShell ($MaximumHistoryCount): 4096
  • Git Bash (echo $HISTSIZE): 500
  • WSL Ubuntu Bash (echo $HISTSIZE): 1000