Линук командна линија бележи све команде које извршавате, омогућавајући вам да претражујете кроз њих и поново користите оне које сте раније користили. Када савладате команду `history` и разумете њене могућности, ваша продуктивност може значајно порасти.
Управљање историјом команди
Постоји позната изрека Џорџа Сантајане која каже: „Они који не памте прошлост, осуђени су да је понове”. На Линук-у, нажалост, ако не можете да се сетите прошлих команди, не можете их поново извршити, чак и ако то желите.
Управо ту на сцену ступа команда `history`. Она вам омогућава да прегледате и поновите претходне команде. Ово не само да штеди време и труд, већ и повећава ефикасност и тачност. Дуже и сложеније команде је тешко запамтити и откуцати без грешке, што може довести до грешака. Неке грешке спречавају извршавање команде, док друге могу довести до неочекиваних резултата.
Команда `history` елиминише те проблеме. Као и многе Линук команде, и ова има више могућности него што се чини на први поглед. Међутим, ако научите како да је користите, побољшаћете своје искуство рада са командном линијом свакодневно. То је инвестиција која се исплати. Постоје бољи начини за коришћење `history` команде од пуког коришћења стрелице нагоре.
Основна употреба команде `history`
У најједноставнијем облику, команду `history` можете користити једноставним уписивањем њеног имена:
history
Након тога, на екрану терминала ће се исписати листа претходно коришћених команди.
Команде су нумерисане, при чему су последње коришћене команде (оне са највећим бројевима) на крају листе.
Да бисте видели одређени број команди, можете навести број на командној линији. На пример, да бисте видели последњих 10 команди, откуцајте:
history 10
Исти резултат можете постићи користећи `tail` команду. Да бисте то урадили, откуцајте:
history | tail -n 10
Поновно извршавање команди
Ако желите поново да употребите команду са листе историје, унесите знак узвика (!) и број команде, без размака између.
На пример, да бисте поновили команду број 37, откуцајте:
!37
Да бисте поновили последњу команду, откуцајте два знака узвика, опет без размака:
!!
Ово може бити корисно када издате команду и заборавите да употребите `sudo`. Само откуцајте `sudo`, један размак, два знака узвика и притисните `Enter`.
У следећем примеру, откуцали смо команду која захтева `sudo`. Уместо да поново куцамо цео ред, можемо уштедети куцање користећи `sudo !!`, као што је приказано испод:
mv ./my_script.sh /usr/local/bin/
sudo !!
Дакле, можете унети одговарајући број са листе да бисте поновили команду или употребити двоструке знаке узвика да поновите последњу команду. Међутим, шта ако желите да поновите пету или осму команду уназад?
Можете употребити један знак узвика, цртицу (-) и број било које претходне команде (опет, без размака) да бисте је поновили.
Да бисте поновили 13. претходну команду, откуцајте:
!-13
Претраживање команди по тексту
Да бисте поновили последњу команду која почиње одређеним текстом, можете откуцати знак узвика, а затим текст без размака, па притиснути `Enter`.
На пример, да бисте поновили последњу команду која је почела са `sudo`, откуцајте:
!sudo
Ипак, ово може бити ризично. Ако последња команда која је почела са `sudo` није она коју сте очекивали, извршићете погрешну команду.
Међутим, као меру предострожности, можете користити модификатор `:p` (приказ), као што је приказано испод:
!sudo:p
Ово ће исписати команду у прозор терминала уместо да је одмах изврши. То вам омогућава да видите команду пре него што је извршите. Ако је то команда коју желите, притисните стрелицу нагоре, а затим `Enter` да бисте је извршили.
Ако желите да пронађете команду која садржи одређени текст, можете користити знак узвика и упитник.
На пример, да бисте пронашли и извршили прву команду која садржи реч „aliases“, откуцајте:
!?aliases
Ово ће пронаћи било коју команду која садржи текст „aliases“, без обзира где се појављује у низу.
Интерактивно претраживање
Интерактивно претраживање вам омогућава да се крећете кроз листу команди и поновите ону коју желите.
Само притисните `Ctrl+r` да бисте започели претрагу.
Док куцате текст за претрагу, појавиће се прва команда која се подудара. Слова која унесете се појављују између обрнутих апострофа (`). Команде које се подударају се ажурирају док куцате свако слово.
Сваки пут када притиснете `Ctrl+r`, претражујете уназад за следећу команду која се подудара и она се појављује у прозору терминала.
Када притиснете `Enter`, приказана команда ће се извршити.
Да бисте уредили команду пре него што је извршите, притисните тастер са стрелицом налево или надесно.
Команда се појављује на командној линији и можете је уређивати.
Можете користити и друге Линук алате за претраживање листе историје. На пример, да бисте претражили команде које садрже текст „aliases“ помоћу `grep`, користите ову команду:
history | grep aliases
Измена последње команде
Ако треба да исправите грешку у куцању, а затим поновите команду, можете употребити знак за уметање (^) да бисте је изменили. Ово је одличан трик у случају да погрешно откуцате команду или желите да је поново покренете са другачијом опцијом или параметром командне линије.
Да бисте га користили, откуцајте (без размака) знак за уметање, текст који желите да замените, други знак за уметање, текст којим желите да га замените, други знак за уметање, а затим притисните `Enter`.
На пример, претпоставимо да откуцате следећу команду, случајно куцајући „shhd“ уместо „sshd“:
sudo systemctl start shhd
Ово можете лако да исправите тако што ћете откуцати:
^shhd^sshd^
Команда се извршава са „shhd“ исправљеним у „sshd“.
Брисање команди са листе историје
Команде можете обрисати са листе историје користећи опцију `-d` (delete). Нема потребе да задржавате погрешно откуцане команде на листи историје.
Можете користити `grep` да је пронађете, проследите њен број `history` команди са опцијом `-d` да бисте је обрисали, а затим претражите поново да бисте проверили да је нестала:
history | grep shhd
history -d 83
history | grep shhd
Такође можете проследити опсег команди опцији `-d`. Да бисте избрисали све уносе са листе од 22 до 32 (укључиво), откуцајте:
history -d 22 32
Да бисте избрисали само последњих пет команди, можете унети негативан број, на пример:
history -d -5
Ручно ажурирање датотеке историје
Када се пријавите или отворите сесију терминала, листа историје се чита из датотеке историје. У Басх-у, подразумевана датотека историје је `.bash_history`.
Све измене које направите у тренутној сесији прозора терминала се уписују у датотеку историје тек када затворите прозор терминала или се одјавите.
Претпоставимо да желите да отворите други прозор терминала да бисте приступили целој листи историје, укључујући команде које сте унели у првом прозору терминала. Опција `-a` (all) вам омогућава да то урадите у првом прозору терминала пре него што отворите други.
Да бисте је користили, откуцајте:
history -a
Команде се тихо уписују у датотеку историје.
Ако желите да упишете све промене на листи историје у датотеку историје (на пример, ако сте избрисали неке старе команде), можете користити опцију `-w` (write), на пример:
history -w
Брисање листе историје
Да бисте обрисали све команде са листе историје, можете користити опцију `-c` (clear), на следећи начин:
history -c
Ако додатно желите да упишете ове промене у датотеку историје, употребите опцију `-w`, на пример:
history -w
Безбедност и датотека историје
Ако користите било коју апликацију која захтева да унесете осетљиве информације (као што су лозинке) у командну линију, запамтите да ће то такође бити сачувано у датотеци историје. Ако не желите да се одређене информације сачувају, можете користити следећу структуру команди да их одмах избришете са листе историје:
special-app my-secret-password;history -d $(history 1)
history 5
Ова структура укључује две команде одвојене тачком и зарезом (;). Разложимо ово:
`special-app`: Назив програма који користимо.
`my-secret-password`: Тајна лозинка коју треба да унесемо за апликацију у командној линији. Ово је крај прве команде.
`history -d`: У другој команди, позивамо `-d` (delete) опцију историје. Оно што ћемо избрисати налази се у следећем делу команде.
`$(history 1)`: Ово користи замену команде. Део команде садржан у `$()` се извршава у под-љуски. Резултат тог извршавања се објављује као текст у оригиналној команди. Команда `history 1` враћа претходну команду. Дакле, о другој команди можете размишљати као о `history -d „последња команда овде“`.
Можете користити команду `history 5` да бисте били сигурни да је команда која садржи лозинку уклоњена са листе историје.
Ипак, постоји још једноставнији начин да се то уради. Пошто Басх игнорише редове који по дефиницији почињу размаком, само додајте размак на почетак реда, на следећи начин:
special-app another-password
history 5
Команда са лозинком није додата на листу историје. Разлог зашто овај трик функционише налази се у `.bashrc` датотеци.
Датотека `.bashrc`
Датотека `.bashrc` се извршава сваки пут када се пријавите или отворите прозор терминала. Она такође садржи неке вредности које контролишу понашање команде историје. Уредимо ову датотеку помоћу `gedit`.
Откуцајте:
gedit .bashrc
На врху датотеке видећете два уноса:
`HISTSIZE`: Максималан број уноса које листа историје може да садржи.
`HISTFILESIZE`: Ограничење броја редова које датотека историје може да садржи.
Ове две вредности узајамно делују на следећи начин:
Када се пријавите или покренете сесију у прозору терминала, листа историје се попуњава из датотеке `.bash_history`.
Када затворите прозор терминала, максимални број команди постављен у `HISTSIZE` се чува у датотеци `.bash_history`.
Ако је омогућена опција `shell histappend`, команде се додају у `.bash_history`. Ако `histappend` није подешен, `.bash_history` се преписује.
Након што сачувате команде са листе историје у `.bash_history`, датотека историје се скраћује тако да не садржи више од `HISTFILESIZE` редова.
Такође, на врху датотеке, видећете унос за вредност `HISTCONTROL`.
Ову вредност можете подесити да уради било шта од следећег:
`ignorespaces`: Линије које почињу размаком се не додају на листу историје.
`ignoredups`: Дупликати команди се не додају у датотеку историје.
`ignoreboth`: Омогућава оба горенаведена.
Такође можете навести одређене команде које не желите да додате на листу историје. Одвојите их двотачком (:) и ставите их под наводнике (“…”).
Пратили бисте ову структуру да бисте додали линију у вашу `.bashrc` датотеку и заменили команде које желите да игноришете:
export HISTIGNORE="ls:history"
Коришћење временских ознака
Ако желите да додате временске ознаке на листу историје, можете користити подешавање `HISTTIMEFORMAT`. Да бисте то урадили, само додајте линију попут следеће у вашу `.bashrc` датотеку:
export HISTTIMEFORMAT="%c "
Имајте на уму да постоји размак испред завршних наводника