Komentotulkki antaa sinun hakea vanhoja komentoja ja syöttää ne uudelleen, voit myös muuttaa niitä tarvittaessa. Tämä on yksi helpoimmista ja tehokkaimmista tavoista vähentää kirjoittamista, sillä toistuvat komentojaksot ovat hyvin yleisiä. Esimerkiksi seuraavassa komentojaksossa käymme läpi eri hakemistoja, listaamme niiden sisällön, poistamme tarpeettomat tiedostot ja tallennamme tiedostoja eri nimillä:
cd Kuvat/ ls -l status.log.* rm status.log.[3-5] mv status.log.1 status.log.bak cd ../Asiakirjat/ ls -l status.log* rm status.log.[2-4] mv status.log.1 status.log.bak cd ../Videot/ ls -l status.log* rm status.log.[2-5] mv status.log.1 status.log.bak
Jos joudut tekemään tällaista siivoamista usein, tahdot ehkä kirjoittaa skriptin, joka automatisoi sen, ja ehkä käyttää "cron"-tehtävää ajamaan sen säännöllisin väliajoin. Mutta toistaiseksi katsomme vain, kuinka voit suuresti vähentää kirjoittamisen määrää syöttäessäsi komentoja käsin.
Edellisessä luvussa katsoimme, kuinka nuolinäppäimiä käytetään liikuttaessa ympäri komentohistoriaa aivan kuin olisit editoimassa tiedostoa. Tässä luvussa tarkastelemme monimutkaisempaa ja vanhempaa tapaa manipuloida komentohistoriaa. Joskus tämän luvun menetelmät tuntuvat helpommilta, joten on vaivan arvoista harjoitella niitä. Oleta esimerkiksi, että kirjoitit tunti sitten komennon "mv" ja tarvitset sitä nyt. On vaikeampaa painaa paluunuolta monta kertaa kuin käyttää tässä luvussa esiteltyä tekniikkaa.
Huutomerkkioperaattori on nimetty huutomerkin "!" mukaan ja se antaa sinun toistaa tiedostohistoriassa olevia komentoja.
"!merkkijono" suorittaa viimeisimmän komennon, joka alkaa merkkijonolla. Niinpä täsmälleen saman "mv"-komennon suorittamiseksi voit kirjoittaa:
!mv
Ehkä et tahdo täsmälleen samaa komentoa? Jos tahdot muuttaa sitä hieman ennen sen suorittamista? Tai ehkä tahdot vain katsoa, mitä huutomerkkioperaattori palauttaa, jotta voit varmistaa, että se on oikea komento? Voit palauttaa sen ilman sen suorittamista lisäämällä valitsimen ":p" (joka tarkoittaa tulostamista):
!mv:p
Näytämme kohta komentojen editoinnin.
Ehkä olet antanut paljon "mv
"-komentoja, mutta tiedät, että komennon keskellä on ainutlaatuinen merkkijono, jonka tahdot? Ympäröi merkkijono kysymysmerkeillä, kuten seuraavassa:
!?log?
Kaksi huutomerkkiä peräkkäin toistaa viimeksi ajetun komennon. Erittäin hyödyllinen komentohistoriatekniikka on viimeisen komennon ajaminen pääkäyttäjän oikeuksilla:
sudo !!
sillä kirjoittelemme usein komentoja ilman oikeita käyttöoikeuksia.
Viimeisimmän komennon ajaminen voi vaikuttaa melko hyödyttömältä, mutta tätä menetelmää voidaan muuttaa ajamaan vain osia viimeisestä komennostasi, kuten näemme myöhemmin.
Komentorivi numeroi jokaisen suoritetun komennon järjestyksessä. Jos tahdot palauttaa komentoja numeron perusteella, voit muuttaa komentokehotettasi sisältämään numeron (myöhempi luku näyttää tämän). Voit myös katsoa komentojen listaa ajamalla komennon "history"
:
$ history ... 502 cd Kuvat/ 503 ls -l status.log* 504 rm status.log.[3-5] 505 mv status.log.1 status.log.bak 506 cd ../Asiakirjat/ 507 history $
Tässä olemme näyttäneet vain ulostulon viimeiset muutamat rivit. Jos tahdot suorittaa uudestaan viimeisimmän "rm"-komennon (komento numero 504), voit tehdä sen syöttämällä komennon:
!504
Mutta numerot ovat luultavasti käyttökelpoisempia, kun ajattelet takaperin. Jos esimerkiksi muistat antaneesi "rm"-komennon, jota seurasi kolme muuta komentoa, voit ajaa "rm"-komennon seuraavasti:
!-4
Tämä käskee komentotulkin aloittaa nykyisestä sijainnista, laskea taaksepäin neljä komentoa ja suorittaa siinä sijaitsevan komennon.
Usein tahdot suorittaa edellisen komennon osia, joko tehtyäsi kirjoitusvirheen, tai koska ajat komentojen sarjaa tiettyä tehtävää varten. Me saamme tämän aikaan käyttämällä huutomerkkioperaattoria valitsimilla.
Kolme hyödyllisintä valitsinta ovat: "*", "!^", ja "!$", jotka ovat oikotiet kaikkiin, ensimmäiseen ja viimeiseen parametriin. Katsotaan näitä järjestyksessä.
"komennonNimi *" suorittaa komennon "komennonNimi" millä tahansa parametreillä, joita käytit viimeisessä komennossasi. Tämä voi olla hyödyllistä, jos teit kirjoitusvirheen. Esimerkiksi kirjoitettuasi "emasc" sen sijaan, että olisit kirjoittanut "emacs":
emasc /home/fred/mywork.java /tmp/testme.java
Tämä epäonnistuu selvästi. Nyt voit kirjoittaa:
emacs !*
Tämä ajaa komennon "emacs
" viimeksi kirjoittamillasi parametreillä. Se on sama, kuin jos kirjoittaisit:
emacs /home/fred/mywork.java /tmp/testme.java
"komennonNimi !^" toistaa ensimmäisen parametrin.
emacs /home/fred/mywork.java /tmp/testme.java svn commit !^ # vastaa komentoa: svn commit /home/fred/mywork.java
"komennonNimi !$" toistaa viimeisen parametrin.
mv /home/fred/downloads/sample_screen_config /home/fred/.screenrc emacs !$ # vastaa komentoa: emacs /home/fred/.screenrc
Voit käyttää näitä myös yhdistettynä. Ehkä kirjoitit:
mv mywork.java mywork.java.backup
kun tahdoit oikeastaan tehdä kopion. Voit korjata tämän suorittamalla:
cp mywork.java.backup mywork.java
Mutta koska käytät parametrejä päinvastaisessa järjestyksessä, hyödyllinen oikotie olisi:
cp !$ !^
Hienovaraisempaa parametrien hallintaa varten voit käyttää kaksoishuutomerkkiä valitsimella ":N" valitaksesi parametrin numero N. Tämä on käyttökelpoisinta, kun ajat komennon sudona, sillä alkuperäisestä komennostasi tulee ensimmäinen parametri. Alla on esimerkki, joka esittelee sen tekemisen.
sudo cp /etc/apache2/sites-available/siteconfig /home/fred/siteconfig.bak echo !^ !!:2 # vastaa komentoa echo cp /etc/apache2/sites-available/siteconfig
Kantama on mahdollinen myös valitsimella "!!:M-N
".
Usein tahdot suorittaa edellisen komennon, mutta muuttaa yhden merkkijonon sen sisällä. Oletetaanpa, että tahdot ajaa komennon tiedostolle "tiedosto1":
$ wc tiedosto1 443 1578 9800 tiedosto1
Nyt tahdot poistaa tiedoston "tiedosto2", jolla on melkein sama nimi kuin tiedostolla "tiedosto1". Voit käyttää edellisen komennon viimeistä parametriä merkeillä "!$", mutta muuta sitä seuraavasti:
$ rm !$:s/1/2/ rm tiedosto2
Tämä näyttää hieman monimutkaiselta, joten puretaan parametri:
!$ : s/1/2/
Merkkiä "!$" seuraa kaksoispiste ja sitten "s"-komento, joka merkitsee "korvausta". Tämän jälkeen on merkkijono, jonka tahdot korvata (1) ja merkkijono, jonka tahdot laittaa sen tilalle (2), joita ympäröivät kauttaviivat. Komentotulkki tulostaa komennon samoin kuin se tulkitsee syötteesi, jonka jälkeen se suorittaa sen.
Koska tällainen korvaaminen on niin yleistä, voit olla tyytyväinen kuullessasi, että on yksinkertaisempi tapa suorittaa komento uudestaan pienellä muutoksella. Voit muuttaa vain yhden merkkijonon komennossa tällä syntaksilla:
$ wc tiedosto1 443 1578 9800 tiedosto1 $ ^1^2 wc tiedosto2
Käytimme tarkemerkkiä "^", merkkijonoa, jonka tahdomme korvata, toista tarkemerkkiä "^", ja merkkijonoa, jonka tahdomme laittaa sen tilalle.
Käytä näppäinyhdistelmää Ctrl + R suorittaaksesi käänteisen haun (englanniksi "reverse-i-search"). Jos esimerkiksi tahdot käyttää komentoa, jota käytit käyttäessässi viimeksi komentoa "snort
", aloita näppäimillä Ctrl + R. Terminaali-ikkunassa näet:
(reverse-i-search)`':
Kun kirjoitat jokaisen kirjaimen (s, n, jne.), komentotulkki näyttää viimeisimmät komennot, joissa tuo merkkijono on jossain. Kun lopetat merkkijonon "snort" kirjoittamisen, voit käyttää näppäimiä Ctrl + R toistuvasti etsiäksesi taaksepäin kaikkien merkkijonon "snort" sisältävien komentojen läpi. Kun löydät komennon, jota olet etsimässä, voit painaa oikeaa tai vasenta nuolta sijoittaaksesi komennon varsinaiselle komentoriville, jotta voit muokata sitä, tai vain painaa Enter suorittaaksesi komennon.
Bash-komentotulkki tallentaa komentohistorian, jotta voit palauttaa edellisten istuntojen komentoja. Mutta historia tallennetaan vain sulkiessasi päätteen. Jos työskentelet kahdella päätteellä samaan aikaan, tämä merkitsee, että et voi jakaa komentoja.
Korjataksesi tämän - jos tahdot päätteen tallentavan jokaisen komennon heti sen suorittamisen jälkeen - lisää seuraavat rivit "~/.bashrc" -tiedostoosi:
shopt -s histappend PROMPT_COMMAND='history -a'
Näiden oikoteiden opetteleminen voi säästää sinulta valtavan määrän aikaa, joten ole hyvä ja kokeile!
There has been error in communication with Booktype server. Not sure right now where is the problem.
You should refresh this page.