Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: ajaaskel - 17.01.13 - klo:09.44
-
Kaikkihan tietävät että päätteessä kun kirjoittelet komennon niin se tallettuu historiatiedostoon josta sen voi kutsua uudestaan vaikkapa nuolinäppäimellä ja että komentojen pitäisi tallettua ".bash_history" tiedostoon ? Noin ainakin oppikirjan mukaan.
Ok, tehdään pieni koe. Kirjoitetaan jokin höpöhöpö komennoksi jolloin sitä on helppoa etsiä, vaikkapa
abcde
Nythän tuon pitäisi löytyä tuolta ".bash_history" tiedostosta:
cat .bash_history | grep "abcde"
Hups, ei löytynytkään. Silti tallessa eli löytyy jos painaa nuoli ylös tai kirjoittaa "history".
Poistetaanpas kokeeksi historiatiedosto kokonaan:
cp .bash_history .bash_history_old
rm .bash_history
Historianhan pitäisi olla poissa ? Eipä olekaan. Historia löytyy edelleen eli säilyy jossain muualla !
Mitenköhän tuo historiamekanismi on oikeasti toteutettu ? Osaksi muistissa ja loppu levyllä ? Tuolta se hieman näyttää kun sulkee ja uudelleen avaa päätettä kurkkien mitä on tapahtunut vaikkapa
cat .bash_history
-
Taitaa mennä niin, että .bash_history päivitetään aina kun sessio päättyy. Testasin itse näin:
1. Katsoin aikaleiman .bash_historysta, joka näytti pari päivää aikaisemmaksi
2. Avasin uuden terminaalin ja suoritin saman komennon, vieläkin sama aikaleima
3. Suljin avatun terminaalin ja katsoin auki olleesta terminaalista aikaleiman ja se oli päivittynyt,
Joten history ottanee session komennot + .bash_historysta löytyvät.
-
Taitaa mennä niin, että .bash_history päivitetään aina kun sessio päättyy.
Näin se oletuksena tekee, mutta history-tiedoston saa kyllä bashissakin päivittymään jokaisen komennon jälkeen halutessaan (joskin hieman mutkikkaammin kuin esim. zsh:ssa):
http://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate (http://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history-immediate)
-
Lueskelin linkit ja näyttää selvinneen mitä tuossa tapahtuu. Asia on kuten "Elekaz" ja "kuutio" tuossa yllä sanoivat.
Ketju näyttänee tältä:
1) Pääte käynnistetään. Tiedosto "~/.bash_history" luetaan muistiin.
2) Katseltaessa historiaa esim. "history" komennolla näytetään muistissa olevat tiedot.
2) Kun annetaan uusi komento se talletetaan vain muistissa olevaan historiaan.
3) Vasta kun pääte suljetaan kirjoitetaan sen hetkisen tiedoston loppuun vain ne komennot jotka oli annettu tässä päätteessä.
Miksi puhun "sen hetkisestä" tiedostosta ? Koska päätteitä voi olla auki monta ja edellinen suljettu pääte on voinut tällä välin jo muuttaa historiatiedostoa.
Tuon toimintatavan voisi kuvailla toisinkin: Historiatiedostoa käytetään alkulähtökohtana kun pääte avataan mutta tiedostoa ei ylläpidetä joka komennon jälkeen vaan vasta kun pääte suljetaan. Kaikki päätteen aukioloaikana annetut komennot kirjoitetaan historiatiedoston jatkoksi päätteen sulkemisvaiheessa.
Hyvä tietää sillä tuo lukee aivan tuoreessa oppikirjassakin väärin.
Tuosta herää kysymys että jos meillä on kaksi päätettä auki ja tehdään jotain komentoja päätteessä A niin milläs tuon sitten saa näkyviin päätteessä B ? Vastaus on aika yksinkertainen jos haluaa tehdä tuon siirron yhden kerran itse:
Päätteessä A:
history -a
eli kirjoitetaan heti historiatiedoston loppuun tässä päätteessä annetut komennot("-a" = append)
Päätteessä B:
history -r
luetaan historiatiedosto ilman että hukataan tässä päätteessä jo annetuja komentoja
Muutakin löytyy:
history -c
tyhjentää tämän päätteen muistissa olevan historian
history -w
kirjoittaa historiatiedoston yli (vanhat tiedot häipyvät) sillä historialla mikä näkyy tässä päätteessä.