Како да користите команди и проширувања на Bash History на Linux VPS
Вовед
Додека работите во опкружување на серверот, ќе поминете многу од вашето време на командната линија. Најверојатно, ќе ја користите баш школката, која е стандардна за повеќето дистрибуции.
За време на терминална сесија, веројатно ќе повторувате некои команди често и ќе пишувате варијации на тие команди уште почесто. Додека пишувањето на секоја команда постојано може да биде добра практика на почетокот, во одреден момент ја преминува границата и станува нарушувачка и вознемирувачка.
За среќа, баш школката има некои прилично добро развиени функции за историја. Учењето како ефективно да ја користите и манипулирате вашата баш историја ќе ви овозможи да потрошите помалку време за пишување и повеќе време за да ја завршите вистинската работа. Многу програмери се запознаени со филозофијата на СУВО на Не се повторувај. Ефикасното користење на историјата на bash ви овозможува да работите поблиску до овој принцип и ќе го забрзате вашиот работен тек.
Предуслови
За да го следите ова упатство, ќе ви треба пристап до компјутер што работи на оперативен систем базиран на Linux. Ова може да биде или виртуелен приватен сервер на кој сте се поврзале со SSH или со вашата локална машина. Забележете дека ова упатство беше потврдено со користење на сервер за Линукс со Ubuntu 20.04, но дадените примери треба да работат на компјутер што работи на која било верзија на која било дистрибуција на Линукс.
Ако планирате да користите далечински сервер за да го следите ова упатство, ве охрабруваме прво да го комплетирате нашето упатство за почетно поставување сервер. Со тоа ќе поставите безбедно опкружување на серверот - вклучувајќи корисник кој не еroot со привилегии sudo
и заштитен ѕид конфигуриран со UFW - што можете да го користите за да го изградите вашиот Linux вештини.
Поставување поставки за историја
Пред да започнете да ја користите вашата историја на команди, може да ви биде корисно да приспособите некои баш поставки за да ја направите покорисна. Овие чекори не се неопходни, но тие можат да го олеснат наоѓањето и извршувањето на командите што сте ги извршиле претходно.
Bash ви овозможува да го прилагодите бројот на команди што ги складира во историјата. Тој всушност има две посебни опции за ова: параметарот HISTFILESIZE
конфигурира колку команди се чуваат во датотеката со историја, додека HISTSIZE
го контролира бројот зачуван во меморијата за тековната сесија .
Ова значи дека можете да поставите разумно ограничување за големината на историјата во меморијата за тековната сесија и да имате уште поголема историја зачувана на дискот што може да ја испитате подоцна. Стандардно, bash поставува многу конзервативни вредности за овие опции, но можете да ги проширите за да искористите поголема историја. Некои дистрибуции веќе ги зголемуваат стандардните поставки за баш историја со малку повеликодушни вредности.
Отворете ја вашата датотека ~/.bashrc
со претпочитаниот уредувач на текст за да ги промените овие поставки. Овде, ќе користиме nano
:
- nano ~/.bashrc
Пребарајте ги и параметрите HISTSIZE
и HISTFILESIZE
. Доколку се поставени, слободно модифицирајте ги вредностите. Ако овие параметри не се во вашата датотека, додајте ги сега. За целите на овој водич, зачувувањето на 10000 линии на дискот и вчитувањето на последните 5000 линии во меморијата ќе функционира добро. Ова е конзервативна проценка за повеќето системи, но можете да ги прилагодите овие бројки ако забележите влијание врз перформансите:
. . .
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=5000
HISTFILESIZE=10000
. . .
Стандардно, bash ја пишува својата историја на крајот од секоја сесија, препишувајќи ја постоечката датотека со ажурирана верзија. Ова значи дека ако сте најавени со повеќе баш сесии, само на последната што ќе излезете ќе ја зачува својата историја.
Можете да го заобиколите ова со поставување на поставката histappend
, која ќе се додаде наместо да ја презапише историјата. Ова можеби е веќе поставено, но ако не е, можете да го овозможите ова со додавање на оваа линија:
. . .
shopt -s histappend
. . .
Ако сакате баш веднаш да додава команди во вашата историја наместо да чекате за крајот на секоја сесија (за да овозможите командите во еден терминал да бидат веднаш достапни во друг), можете исто така да поставите или да ја додате историјата -a
команда до параметарот PROMPT_COMMAND
, кој содржи команди кои се извршуваат пред секоја нова командна линија.
За да го конфигурирате ова правилно, ќе треба да го приспособите PROMPT_COMMAND
на bash за да го промените начинот на кој командите се снимаат во датотеката со историја и во меморијата на тековната сесија на школка:
- Прво, треба веднаш да се додаде на датотеката со историја со
history -a
. - Следно, мора да ја исчистите тековната историја во вашата сесија на школка со
history -c
. - Конечно, за да ја вчитате ажурираната историја назад во вашата сесија на школка, користете ја командата
history -r
.
Спојувањето на сите овие команди по редослед во променливата школка PROMPT_COMMAND
ќе резултира со следново, кое можете да го залепите во вашата датотека .bashrc
:
. . .
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
. . .
Кога ќе завршите, зачувајте ја датотеката и излезете. Ако сте ја уредиле вашата датотека .bashrc
со nano
, направете го тоа со притискање на CTRL + X
, Y
и потоа ENTER
.
За да ги имплементирате вашите промени, или одјавете се и повторно вратете се или source
датотеката со извршување:
- source ~/.bashrc
Со тоа, сте прилагодиле како вашата школка се справува со историјата на команди. Сега можете да вежбате да ги пронајдете вашите претходни команди со командата history
.
Преглед на вашата претходна историја на Bash
Начинот на прегледување на вашата баш историја е да ја користите командата history
. Ова ќе ги испечати нашите неодамнешни команди, по една команда по линија. Ова треба да го даде најмногу бројот на линии што сте ги избрале за променливата HISTSIZE
. Веројатно ќе биде помалку во овој момент:
- history
Output . . .
43 man bash
44 man fc
45 man bash
46 fc -l -10
47 history
48 ls -a
49 vim .bash_history
50 history
51 man history
52 history 10
53 history
Секоја команда што ја враќа историја
е поврзана со број за лесно упатување. Овој водич ќе објасни како ова може да биде корисно подоцна.
Можете да го скратите излезот со наведување број по командата. На пример, ако сакате да ги вратите само последните 5 команди што беа извршени, можете да напишете:
- history 5
Output 50 history
51 man history
52 history 10
53 history
54 history 5
За да ги пронајдете сите команди history
кои содржат одредена низа, можете да ги внесете резултатите во командата grep
која ја пребарува секоја линија за дадена низа. На пример, можете да ги пребарувате линиите што имаат cd
со внесување:
- history | grep cd
Output 33 cd Pictures/
37 cd ..
39 cd Desktop/
61 cd /usr/bin/
68 cd
83 cd /etc/
86 cd resolvconf/
90 cd resolv.conf.d/
Има многу ситуации каде што може да биде корисно да се врати списокот на команди што претходно сте ги извршиле. Ако сакате повторно да извршите една од тие команди, вашиот инстинкт може да биде да копирате една од командите од вашиот излез и да ја залепите во вашиот промпт. Ова функционира, но bash доаѓа со голем број кратенки кои ви дозволуваат да преземате, а потоа автоматски да ги извршувате командите од вашата историја.
Извршување на команди од вашата историја на Bash
Печатењето на вашата историја на команди може да биде корисно, но навистина не ви помага да пристапите до тие команди освен како референца.
Може да се потсетите и веднаш да извршите која било од командите вратени од операцијата history
според нејзиниот број на кој му претходи извичник (!
). Претпоставувајќи дека вашите резултати од историја
се усогласени со оние од претходниот дел, можете брзо да ја проверите страницата со човек за командата history
со внесување:
- !51
Ова веднаш ќе ја потсети и изврши командата поврзана со историјата број 51.
Можете исто така да извршувате команди во однос на вашата моментална позиција со користење на синтаксата !-n
, каде што \n” се заменува со бројот на претходни команди што сакате да ги повикате.
Како пример, кажете дека сте ги извршиле следните две команди:
- ls /usr/share/common-licenses
- echo hello
Ако сакате да се потсетите и да ја извршите командата што ја извршивте пред вашата најнова (командата ls
), можете да напишете !-2
:
- !-2
За повторно да ја извршите последната команда што ја извршивте, можете да извршите !-1
. Сепак, bash обезбедува кратенка која се состои од две извичници кои ќе ја заменат најновата команда и ќе ја извршат:
- !!
Многу луѓе го користат ова кога пишуваат команда, но заборавиле дека им се потребни sudo
привилегии за таа да се изврши. Со внесување sudo !!
повторно ќе се изврши командата со sudo
пред неа:
- touch /etc/hello
Outputtouch: cannot touch `/etc/hello': Permission denied
- sudo !!
Outputsudo touch /etc/hello
[sudo] password for sammy:
Ова покажува уште едно својство на оваа синтакса: овие кратенки се чисти замени и можат да се вградат во други команди по желба.
Лизгање низ историјата на Баш
Постојат неколку начини на кои можете да се движите низ историјата на баш, ставајќи ја секоја наредна команда на командната линија за уредување.
Најчестиот начин да го направите ова е да го притиснете копчето со стрелка нагоре во командната линија. Секое дополнително притискање на копчето со стрелка нагоре ќе ве врати назад во историјата на вашата командна линија.
Ако треба да одите во другата насока, копчето со стрелка надолу ја минува историјата во спротивна насока, конечно ќе ве врати на тековното празно известување.
Ако поместувањето на раката до копчињата со стрелки изгледа како голема мака, можете да се движите наназад во историјата на команди користејќи ја комбинацијата CTRL + P
и да ја користите CTRL + N
комбинација за повторно да продолжите напред низ вашата историја.
Ако сакате да се вратите на тековната командна линија, можете да го сторите тоа со притискање на META + >
. Во повеќето случаи, копчето \мета е копчето ALT
, така што META + >
ќе значи притискање на ALT + SHIFT + .
. е корисно ако се најдете многу наназад во вашата историја и сакате да се вратите на празното барање.
Можете исто така да отидете во првата линија од историјата на вашата команда со правење на спротивен маневар и внесување META + <
. Ова обично значи притискање на ALT + SHIFT + ,
.
Да резимираме, ова се неколку копчиња и комбинации на копчиња што можете да ги користите за да се движите низ историјата и да скокнете на двата краја:
Копче со стрелка нагоре
: скролувајте наназад во историјатаCTRL + P
: скролувајте наназад во историјатаКопче со стрелка надолу
: лизгајте напред во историјатаCTRL + N
: скролувајте напред во историјатаALT + SHIFT + .
: Скокни до крајот на историјата (последна)ALT+ SHIFT + ,
: Скокни до почетокот на историјата (најдалечната)
Пребарување низ историјата на Баш
Иако поставувањето на командата history
преку grep
може да биде корисен начин за стеснување на резултатите, тоа не е идеално во многу ситуации.
Bash вклучува функционалност за пребарување за неговата историја. Вообичаениот начин на користење на ова е преку пребарување наназад во историјата (најновите резултати се вратени прво) со помош на комбинацијата на копчиња CTRL + R
.
На пример, можете да напишете CTRL + R
и да започнете да пишувате дел од претходната команда. Треба само да напишете дел од командата. Ако се совпаѓа со несакана команда наместо тоа, можете повторно да притиснете CTRL + R
за следниот резултат.
Ако случајно ја предадете командата што ја сакате, можете да се движите во спротивна насока со внесување CTRL + S
. Ова исто така може да биде корисно ако сте се преселиле во друга точка во вашата историја користејќи ги копчињата во последниот дел и сакате да пребарувате напред.
Имајте предвид дека, во многу терминали, комбинацијата CTRL + S
е мапирана за да се суспендира терминалната сесија. Ова ќе ги пресретне сите обиди да се префрли CTRL + S
на баш и ќе го „замрзне“ вашиот терминал. За да го одмрзнете, напишете CTRL + Q
за да ја прекинете сесијата.
Оваа функција за суспендирање и продолжување не е потребна во повеќето модерни терминали и можете да ја исклучите без никаков проблем со извршување на следнава команда:
- stty -ixon
stty
е алатка која ви овозможува да ги промените поставките на вашиот терминал од командната линија. Може да ја додадете оваа команда stty -ixon
на крајот од вашата датотека ~/.bashrc
за да ја направите и оваа промена трајна.
Ако сега повторно се обидете да пребарувате со CTRL + S
, тоа треба да работи како што се очекува за да ви овозможи да пребарувате напред.
Пребарување откако сте внеле дел од командата
Вообичаено сценарио во кое треба да се најдете е да внесете дел од командата, за потоа да сфатите дека сте ја извршиле претходно и можете да ја пребарувате историјата за неа.
Правилниот начин на пребарување користејќи го она што е веќе на вашата командна линија е да го поместите курсорот на почетокот на линијата со CTRL + A
, повикајте ја обратната историја со CTRL + R
, залепете ја тековната линија во пребарувањето со CTRL + Y
, а потоа повторно користејќи ги CTRL + R
за пребарување обратно.
На пример, да претпоставиме дека сакате да го ажурирате кешот на вашиот пакет на Ubuntu систем. Веќе го напишавте ова неодамна, но не размислувавте за тоа дури откако повторно не го напишете sudo
во промптот:
- sudo
Во овој момент, сфаќате дека ова е операција што дефинитивно сте ја направиле во изминатиот ден или така. Можете да притиснете CTRL + A
за да го поместите курсорот на почетокот на линијата. Потоа, притиснете CTRL + R
за да го повикате вашето обратно постепено пребарување на историјата. Ова има несакан ефект на копирање на целата содржина на командната линија што беше по нашата позиција на курсорот и ставање во вашата таблата со исечоци.
Следно, притиснете CTRL + Y
за да ги залепите командните сегменти што штотуку ги копиравте од командната линија во пребарувањето. На крајот, притиснете CTRL + R
за да се движите наназад во вашата историја, барајќи команди што ја содржат содржината што штотуку сте ја залепиле.
Користењето на вакви кратенки на почетокот може да изгледа досадно, но може да биде доста корисно кога ќе се навикнете на тоа. Исклучително е корисно кога ќе се најдете во позиција каде што сте напишале половина од сложената команда и знаете дека ќе ви треба историјата за да го завршите остатокот.
Наместо да ги мислите како посебни комбинации на копчиња, може да ви помогне да ги замислите како една сложена операција. Можете само да го држите притиснато копчето CTRL
и потоа притиснете A
, R
, Y
, а потоа притиснете R
копчете последователно.
Запознавање со повеќе напредно проширување на историјата
Овој водич веќе ги допре некои од најфундаменталните техники за проширување на историјата што ги нуди bash. Некои од оние што ги опфативме досега се:
!!
: проширете до последната команда!n
: проширете ја командата со број на историја \n.!-n
: проширете до командата што беше \n број на команди пред тековната команда во историјата.
Означувачи на настани
Горенаведените три примери се примери на означувачи на настани. Овие генерално се начини за потсетување на претходните команди за историја користејќи одредени критериуми. Тие се изборниот дел од вашите достапни операции.
На пример, можете да ја извршите последната команда ssh
што сте ја извршиле со впишување нешто како:
- !ssh
Ова бара линии во вашата историја на команди кои започнуваат со ssh
. Ако сакате да пребарувате низа што не е на почетокот на командата, можете да ја опкружите со знаци ?
. На пример, за да ја повторите претходната команда apt-cache search
, веројатно би можеле да ја извршите следнава команда за да ја пронајдете и извршите:
- !?search?
Друг ознака за настан што можете да го пробате вклучува замена на низа во вашата последна команда за друга. За да го направите ова, внесете го симболот за заштитник (^
) проследен со низата што сакате да ја замените, а потоа веднаш следете ја со друга карта, стрингот за замена и последен жиг на крајот. Не вклучувајте празни места освен ако тие не се дел од низата што сакате да ја замените или дел од низата што сакате да ја користите како замена:
- ^original^replacement^
Ова ќе ја потсети претходната команда (исто како !!
), ќе побара пример од оригиналот
во командната низа и ќе ја замени со замена
. Потоа ќе ја изврши командата користејќи ја низата за замена.
Ова е корисно за справување со работи како погрешно правопис. На пример, кажете дека погрешно сте ја извршиле оваа команда кога се обидувате да ја прочитате содржината на датотеката /etc/hosts
:
- cat /etc/hosst
Outputcat: /etc/hosst: No such file or directory
Наместо да ја преработите целата команда, наместо тоа, можете да го извршите следново:
- ^hosst^hosts^
Ова ќе ја поправи грешката во претходната команда и ќе ја изврши успешно.
Означувачи на зборови
По назначувачите на настани, можете да додадете две точки (:
) проследено со означувач на збор за да изберете дел од совпадната команда.
Тоа го прави со делење на командата на \зборови, кои се дефинирани како кое било парче одвоено со празно место.Ова ви овозможува неколку интересни можности за интеракција со вашите командни параметри.
Нумерирањето на зборовите започнува во почетната команда како \0, првиот аргумент како \1, и продолжува оттаму.
На пример, можете да ја наведете содржината на директориумот и потоа да одлучите дека сакате да навигирате во истиот директориум. Можете да го направите тоа со извршување на следните операции назад до назад:
- ls /usr/share/common-licenses
- cd !!:1
Во случаи како овој кога работите на последната команда, можете да го скратите ова со отстранување на вториот !
како и дебелото црево:
- cd !1
Ова ќе функционира на ист начин.
Може да се повикате на првиот аргумент со карт (^
) и последниот аргумент со знак за долар ($
) ако тоа има смисла за вашите цели. Овие се покорисни кога се користат опсези наместо конкретни броеви. На пример, имате три начини на кои можете да ги внесете сите аргументи од претходната команда во нова команда:
- !!:1*
- !!:1-$
- !!:*
Единствениот *
се проширува на сите делови од командата што се повикуваат, освен почетната команда. Слично, можете да користите број проследен со *
за да значи дека треба да се вклучи сè по наведениот збор.
Модификатори
Друга работа што можете да направите за да го зголемите однесувањето на линијата за историја што ја потсетувате е да го измените однесувањето на отповикувањето за да манипулирате со самиот текст. За да го направите ова, можете да додадете модификатори по знакот за две точки (:
) на крајот од проширувањето.
На пример, можете да ја отсечете патеката што води до датотека со користење на модификаторот h
(тоа значи \head), кој ја отстранува патеката нагоре до последната коса црта (/
) знак. Имајте предвид дека ова нема да функционира како што сакате ако го користите ова за скратување на патеката на директориумот и патеката завршува со заостанувачка коса црта.
Вообичаен случај на употреба за ова е ако менувате датотека и сфаќате дека сакате да се смените во директориумот на датотеката за да извршите операции на поврзани датотеки.
На пример, кажете дека ја извршувате оваа команда за да ја испечатите содржината на лиценцата за софтвер со отворен код на вашиот излез:
- cat /usr/share/common-licenses/Apache-2.0
Откако ќе се уверите дека лиценцата одговара на вашите потреби, можеби ќе сакате да се смените во директориумот каде што се чува. Можете да го направите ова со повикување на командата cd
на синџирот на аргументи и отсекување на името на датотеката на крајот:
- cd !!:$:h
Ако извршите pwd
, кој го печати вашиот тековен работен директориум, ќе откриете дека сте отишле до директориумот вклучен во претходната команда:
- pwd
Output/usr/share/common-licenses
Откако ќе бидете таму, можеби ќе сакате повторно да ја отворите датотеката со лиценца за да проверите двапати, овој пат во пејџер како less
.
За да го направите ова, можете да го направите обратното од претходната манипулација со отсекување на патеката и користење само на името на датотеката со модификаторот t
, што значи \опашка. Можете да го пребарувате вашиот последен < операцијаcat и користете го знамето t
за да го пренесете само името на датотеката:
- less !cat:$:t
Можете исто толку лесно да го задржите целосното апсолутно име на патеката и оваа команда ќе работи правилно во овој пример. Сепак, може да има и други моменти кога тоа не е точно. На пример, може да гледате датотека вгнездена во неколку поддиректориуми под вашиот тековен работен директориум користејќи релативна патека, а потоа да се смените во поддиректориумот користејќи го модификаторот \h. Во овој случај, нема да можете да се потпрете на името на релативната патека за повеќе да стигнете до датотеката.
Друг екстремно корисен модификатор е модификаторот r
кој ја отстранува наставката што следи. Ова би можело да биде корисно ако користите tar
за да извлечете датотека и сакате да се промените во директориумот што произлегува. Претпоставувајќи дека директориумот произведен е истото име како датотеката, можете да направите нешто како:
- tar xzvf long-project-name.tgz
- cd !!:$:r
Ако вашиот tarball користи екстензија tar.gz
наместо tgz
, можете само двапати да го поминете модификаторот:
- tar xzvf long-project-name.tgz
- cd !!:$:r:r
Сличен модификатор, e
, отстранува сè освен наставката заостаната.
Ако не сакате да ја извршите командата што ја потсетувате и сакате само да ја пронајдете, можете да го користите модификаторот p
за да ја извршите командата bash echo наместо да ја извршите.
Ова е корисно ако не сте сигурни дали го избирате правилното парче. Ова не само што го печати, туку и го става во вашата историја за понатамошно уредување доколку сакате да го измените.
На пример, замислете дека извршивте команда find
на вашиот домашен директориум и потоа сфативте дека сакате да ја извршите од root (/
) директориумот. Може да проверите дали правите правилни замени вака (под претпоставка дека оригиналната команда е поврзана со бројот 119 во вашата историја):
- find ~ -name "file1"
- !119:0:p / !119:2*:p
Outputfind / -name "file1"
Ако вратената команда е точна, можете да ја извршите со комбинацијата на копчиња CTRL + P
.
Можете исто така да направите замени во вашата команда со користење на синтаксата s/оригинал/new/
.
На пример, можевте да го постигнете тоа со пишување:
- !119:s/~/\//
Ова ќе го замени првиот примерок на шемата за пребарување (~
).
Можете да го замените секој натпревар со додавање на знамето g
со s
. На пример, ако сакате да креирате датотеки со име file1
, file2
и file3
, а потоа сакате да креирате директориуми наречени dir1
, dir2
, dir3
, можете да го направите ова:
- touch file1 file2 file3
- mkdir !!:*:gs/file/dir/
Се разбира, можеби е поинтуитивно да се изврши само mkdir dir1 dir2 dir3
во овој случај. Меѓутоа, како што ќе ви биде удобно да користите модификатори и другите алатки за проширување на историјата на bash, можете многу да ги проширите вашите способности и продуктивност на командната линија.
Заклучок
Со читање на овој водич, сега треба да имате добра идеја за тоа како можете да ги искористите операциите со историја што ви се достапни. Некои од нив веројатно ќе бидат покорисни од другите, но добро е да знаете дека bash ги има овие способности во случај да се најдете во позиција каде што би било корисно да ги ископате.
Ако ништо друго, само командата history
, обратното пребарување и основните проширувања на историјата можат многу да ви помогнат да го забрзате работниот тек.