Jako výchozí shell pro mnoho variant Linuxu a Unixu obsahuje Bash širokou škálu nevyužívaných funkcí, takže bylo těžké rozhodnout, o čem diskutovat. Nakonec jsem se rozhodl zaměřit na Bash tipy, které usnadňují každodenní činnosti.
Jako konzultant vidím mnoho různých prostředí a stylů práce. Na základě této zkušenosti jsem zúžil tipy na čtyři široké kategorie:Terminálové a linkové triky, navigace a soubory, historie a užitečné příkazy. Tyto kategorie jsou zcela libovolné a slouží spíše k uspořádání mých vlastních myšlenek než k nějaké definitivní klasifikaci. Mnoho zde uvedených tipů může subjektivně spadat do více než jedné kategorie.
Bez dalších okolků zde jsou některé z nejužitečnějších Bashových triků, se kterými jsem se setkal.
Práce s historií Bash
Jedním z nejlepších způsobů, jak zvýšit svou produktivitu, je naučit se efektivněji používat historii Bash. S ohledem na to je možná jedním z nejdůležitějších vylepšení, které můžete provést v prostředí pro více uživatelů, povolit histappend
možnost do vašeho shellu. Chcete-li to provést, jednoduše spusťte následující příkaz:
shopt -s histappend
To umožňuje více terminálových relací zapisovat do historie současně. Ve většině prostředí tato možnost není povoleno. To znamená, že historie se často ztrácí, pokud máte otevřenou více než jednu relaci Bash (buď lokálně nebo přes SSH).
Dalším běžným úkolem je zopakovat poslední příkaz pomocí sudo
. Předpokládejme například, že chcete vytvořit adresář mkdir /etc/ansible/facts.d
. Pokud nejste root, tento příkaz selže. Z toho, co jsem pozoroval, většina uživatelů klikla na up
šipku, přejděte na začátek řádku a přidejte sudo
příkaz. Existuje jednodušší způsob. Jednoduše spusťte příkaz takto:
sudo !!
Bash spustí sudo
a poté celý předchozí příkaz. Tady je přesně to, jak to vypadá při spuštění v sekvenci:
[user@centos ~]$ mkdir -p /etc/ansible/facts.d
mkdir:nelze vytvořit adresář '/etc/ansible':Oprávnění odepřeno
[user@ centos ~]$ sudo !!
sudo mkdir -p /etc/ansible/facts.d
Když !!
je spuštěn, celý příkaz se odešle do terminálu, takže víte, co bylo právě provedeno.
Podobné, ale mnohem méně používané je !*
zkratka. To říká Bashovi, že chcete všechny *argumenty* z předchozího příkazu, který se má opakovat v aktuálním příkazu. To může být užitečné pro příkaz, který má mnoho argumentů, které chcete znovu použít. Jednoduchým příkladem je vytvoření hromady souborů a následná změna oprávnění k nim:
[user@centos tmp]$ dotykový soubor1 soubor2 soubor3 soubor4
[user@centos tmp]$ chmod 777 !*
chmod 777 soubor1 soubor2 soubor3 soubor4
Je to užitečné pouze za určitých okolností, ale může vám ušetřit několik stisknutí kláves.
Když už jsme u ukládání úhozů, promluvme si o hledání příkazů ve vaší historii. Většina uživatelů udělá něco takového:
history |grep <some command>
Existuje však jednodušší způsob, jak prohledávat historii. Pokud stisknete
ctrl + r
Bash provede zpětné vyhledávání vaší historie. Jakmile začnete psát, začnou se zobrazovat výsledky. Například:
(reverse-i-search)`hist': shopt -s histappend
Ve výše uvedeném příkladu jsem zadal hist
a odpovídalo shopt
příkaz, který jsme probrali dříve. Pokud budete pokračovat mačkáním ctrl + r
, Bash bude pokračovat ve zpětném vyhledávání všech ostatních shod.
Náš poslední trik není ani tak trikem, jako užitečným příkazem, který můžete použít k počítání a zobrazení nejpoužívanějších příkazů ve vaší historii.
[user@centos tmp]$ historie | awk 'BEGIN {FS="[ \t]+|\\|"} {tisk $3}' | seřadit | uniq -c | seřadit -č | hlava
81 ssh
50 sudo
46 ls
45 ping
39 cd
29 nvidia-xrun
20 nmap
19 exportovat
V tomto příkladu můžete vidět ssh
je v současnosti zdaleka nejpoužívanějším příkazem v mé historii.
Navigace a pojmenování souborů
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Pravděpodobně už víte, že pokud zadáte příkaz, název souboru nebo složky, můžete kliknout na tab
jednou stiskněte, aby se znění doplnilo za vás. To funguje, pokud existuje jedna přesná shoda. To však možná nevíte, pokud stisknete tab
dvakrát vám ukáže všechny shody na základě toho, co jste zadali. Například:
[user@centos tmp]$ cd /lib
lib/ lib64/
To může být velmi užitečné pro navigaci v souborovém systému. Dalším užitečným trikem je povolit cdspell
ve vaší skořápce. Můžete to udělat zadáním shopt -s cdspell
příkaz. To vám pomůže opravit vaše překlepy:
[user@centos etc]$ cd /tpm
/tmp
[user@centos tmp]$ cd /ect
/etc
Není to dokonalé, ale každá maličkost pomáhá!
Jakmile úspěšně změníte adresáře, co když se potřebujete vrátit do předchozího adresáře? To není velký problém, pokud nejste příliš hluboko ve stromu adresářů. Ale pokud jste na poměrně hluboké cestě, jako je /var/lib/flatpak/exports/share/applications/
, můžete napsat:
cd /va<tab>/lib/fla<tab>/ex<tab>/sh<tab>/app<tab>
Naštěstí si Bash pamatuje váš předchozí adresář a můžete se tam vrátit jednoduše zadáním cd -
. Tady je, jak by to vypadalo:
[aplikace user@centos]$ pwd
/var/lib/flatpak/exports/share/applications
[aplikace user@centos]$ cd /tmp
[ user@centos tmp]$ pwd
/tmp
[user@centos tmp]$ cd -
/var/lib/flatpak/exports/share/applications
To je všechno v pořádku, ale co když máte spoustu adresářů, ve kterých chcete snadno procházet? Bash tě tam také pokryl. Existuje proměnná, kterou můžete nastavit a která vám pomůže s efektivnější navigací. Zde je příklad:
[aplikace user@centos]$ export CDPATH='~:/var/log:/etc'
[aplikace user@centos]$ cd hp
/etc/hp
[user@centos hp]$ cd ke stažení
/home/user/Stažení
[user@centos ke stažení]$ cd ansible
/etc/ansible
[user@centos ke stažení] $ cd journal
/var/log/journal
Ve výše uvedeném příkladu jsem nastavil svůj domovský adresář (označený vlnovkou:~
), /var/log
a /etc
. Cokoli na nejvyšší úrovni těchto adresářů bude automaticky vyplněno, když na ně odkazujete. Adresáře, které nejsou v základu adresářů uvedených v CDPATH
nebude nalezen. Pokud byl například adresář, o který usilujete, /etc/ansible/facts.d/
to se nedokončí zadáním cd facts.d
. Je to proto, že zatímco adresář ansible
najdete pod /etc
, facts.d
není. Proto CDPATH
je užitečný pro přechod na začátek stromu, ke kterému často přistupujete, ale jeho správa může být při procházení rozsáhlé struktury složek těžkopádná.
Nakonec si promluvme o dvou běžných případech použití, které v určitém okamžiku dělá každý:Změna přípony souboru a přejmenování souborů. Na první pohled to může znít jako totéž, ale Bash nabízí několik různých triků, jak tyto úkoly splnit.
I když se může jednat o operaci „stažení a zašpinění“, většina uživatelů v určitém okamžiku potřebuje vytvořit rychlou kopii souboru, na kterém pracují. Většina z nich přesně zkopíruje název souboru a jednoduše připojí příponu souboru jako .old
nebo .bak
. V Bash na to existuje rychlá zkratka. Předpokládejme, že máte název souboru jako spideroak_inotify_db.07pkh3
jehož kopii si chcete ponechat. Můžete napsat:
cp spideroak_inotify_db.07pkh3 spideroak_inotify_db.07pkh3.bak
Můžete to rychle vyřešit pomocí operací kopírování/vložení, použitím karty dokončeno, případně použitím jedné ze zkratek pro opakování argumentu nebo jednoduše zadáním celé věci. Nicméně níže uvedený příkaz by měl být ještě rychlejší, jakmile si zvyknete na jeho psaní:
cp spideroak_inotify_db.07pkh3{,.old}
Toto (jak můžete hádat) zkopíruje soubor připojením .old
přípona souboru k souboru. To je skvělé, řeknete si, ale já chci přejmenovat velké množství souborů najednou. Jistě, mohli napsat cyklus for, který se s tím vypořádá (a ve skutečnosti to často dělám pro něco složitého), ale proč byste to dělali, když existuje šikovný nástroj nazvaný rename
? Existuje určitý rozdíl v použití tohoto nástroje mezi Debian/Ubuntu a CentOS/Arch. Přejmenování založené na Debianu používá syntaxi podobnou SED:
user@ubuntu-1604:/tmp$ pro x v `seq 1 5`; dotkněte se souboru old_text_file_${x}.txt; hotovo
user@ubuntu-1604:/tmp$ ls old_text_file_*
old_text_file_1.txt old_text_file_3.txt old_text_file_5.txt
old_text_file_2.txt old_text_file_4.txt
>user@ubuntu-1604:/tmp$ přejmenovat 's/old_text_file/shiney_new_doc/' *.txt
user@ubuntu-1604:/tmp$ ls shiney_new_doc_*
shiny_new_doc_1.txt shiney_new_doc_3.txt shiney_new_doc_5.txt
shiney_new_doc_2.txt shiney_new_doc_4.txt
Na krabici CentOS nebo Arch by to vypadalo podobně:
[user@centos /tmp]$ pro x v `seq 1 5`; dotkněte se souboru old_text_file_${x}.txt; hotovo
[user@centos /tmp]$ ls old_text_file_*
old_text_file_1.txt old_text_file_3.txt old_text_file_5.txt
old_text_file_2.txt old_text_file_4.txt
[user@centos tmp]$ přejmenovat starý_textový_soubor centos_new_doc *.txt
[user@centos tmp]$ ls centos_new_doc_*
centos_new_doc_1.txt centos_new_doc_3.txt centos_new_br>new2_txt<.txt centos_new_doc_4.txt
Vazby kláves Bash
Bash má spoustu vestavěných klávesových zkratek. Jejich seznam najdete zadáním bind -p
. Myslel jsem, že by bylo užitečné zdůraznit několik, i když některé mohou být dobře známé.
- ctrl + _ (vrátit zpět)
- ctrl + t (prohoďte dva znaky)
- ALT + t (prohoďte dvě slova)
- ALT + . (vytiskne poslední argument z předchozího příkazu)
- ctrl + x + * (rozbalit glob/hvězda)
- ctrl + šipka (posunout o slovo vpřed)
- ALT + f (posunout o slovo vpřed)
- ALT + b (posun o slovo zpět)
- ctrl + x následuje ctrl + e (otevře řetězec příkazu v editoru, abyste jej mohli před provedením upravit)
- ctrl + e (přesunout kurzor na konec)
- ctrl + a (přesuňte kurzor na začátek)
- ctrl + xx (přesuňte se na opačný konec řádku)
- ctrl + u (vystřihne vše před kurzorem)
- ctrl + k (vystřihne vše za kurzorem)
- ctrl + y (vloží z vyrovnávací paměti)
- ctrl + l (malé L, vymaže obrazovku)
Nebudu rozebírat ty zjevnější. Nicméně některé z nejužitečnějších zkratek, které jsem našel, jsou ty, které vám umožní odstranit slova (nebo části textu) a vrátit je zpět. Předpokládejme, že byste chtěli zastavit spoustu služeb pomocí systemd
, ale po dokončení nějaké operace jste chtěli spustit jen několik z nich. Můžete udělat něco takového:
systemctl stop httpd mariadb nfs smbd
Ale co když jste jeden odstranili příliš mnoho? Žádný problém – stačí použít ctrl + _
vrátit zpět poslední úpravu.
Další příkazy pro vyjmutí umožňují rychle odstranit vše od kurzoru až po konec nebo začátek řádku (pomocí Ctrl + k
a Ctrl + u
, respektive). To má další výhodu v umístění vyjmutého textu do vyrovnávací paměti terminálu, takže jej můžete vložit později (pomocí ctrl + y
). Tyto příkazy je těžké zde předvést, proto vám důrazně doporučuji, abyste si je vyzkoušeli na vlastní kůži.
V neposlední řadě bych rád zmínil zřídka používanou kombinaci kláves, která může být mimořádně užitečná v omezených prostředích, jako jsou kontejnery. Pokud budete mít někdy příkaz zkomolený předchozím výstupem, existuje řešení:Stiskněte ctrl + x + ctrl + e
otevře příkaz v libovolném editoru nastaveném v proměnné prostředí EDITOR. To vám umožní upravit dlouhý nebo zkomolený příkaz v textovém editoru, který (potenciálně) umí zalamovat text. Uložením práce a ukončením, stejně jako při práci s normálním souborem, se příkaz spustí po opuštění editoru.
Různé tipy
Možná zjistíte, že zobrazení barev v prostředí Bash může zlepšit váš zážitek. Pokud používáte relaci, která nemá povoleno barvení, níže je řada příkazů, které můžete umístit do svého .bash_profile
pro přidání barvy do vaší relace. Ty jsou poměrně jednoduché a neměly by vyžadovat hloubkové vysvětlení:
# povolit barvy
eval "`dircolors -b`"
# vynutit ls vždy používat indikátory barev a typů
alias ls='ls -hF --color =auto'
#, aby příkaz dir fungoval trochu jako ve Windows (dlouhý formát)
alias dir='ls --color=auto --format=long'
# zvýrazněte výsledky grep pomocí barvy
exportujte GREP_OPTIONS='--color=auto'
# Přidejte trochu barvy na stránky LESS/MAN
exportujte LESS_TERMCAP_mb=$' \E[01;31m'
export LESS_TERMCAP_md=$'\E[01;33m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m '
export LESS_TERMCAP_so=$'\E[01;42;30m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;36m'Spolu s úpravou různých možností v rámci Bash můžete také použít několik elegantních triků, které ušetří čas. Chcete-li například spustit dva příkazy za sebou, bez ohledu na stav ukončení každého z nich, použijte
;
pro oddělení příkazů, jak je vidět níže:[user@centos /tmp]$ du -hsc * ; df -h
To jednoduše vypočítá množství místa, které každý soubor v aktuálním adresáři zabírá (a sečte to), pak se systém zeptá na využití disku na blokové zařízení. Tyto příkazy budou spuštěny bez ohledu na jakékoli chyby generované
du
příkaz.Co když chcete, aby byla po úspěšném dokončení prvního příkazu provedena akce? Můžete použít
&&
zkratka označující, že chcete spustit druhý příkaz pouze v případě, že první příkaz vrátí stav úspěšného ukončení. Předpokládejme například, že chcete restartovat počítač pouze v případě, že jsou aktualizace úspěšné:[root@arch ~]$ pacman -Syu --noconfirm && reboot
Někdy při spouštění příkazu možná budete chtít zachytit jeho výstup. Většina lidí ví o
tee
příkaz, který zkopíruje standardní výstup do terminálu i do souboru. Pokud však chcete zachytit složitější výstup, řekněme,strace
, budete muset začít pracovat s přesměrováním I/O. Podrobnosti o přesměrování I/O jsou mimo rozsah tohoto krátkého článku, ale pro naše účely se zabývámeSTDOUT
aSTDERR
. Nejlepší způsob, jak zachytit přesně to, co vidíte, je spojit tyto dva v jednom souboru. Chcete-li to provést, použijte2>&1
přesměrování.[root@arch ~]$ strace -p 1140 > strace_output.txt 2>&1
Tím se veškerý relevantní výstup vloží do souboru s názvem
strace_output.txt
k pozdějšímu zobrazení.Někdy během dlouhotrvajícího příkazu může být nutné pozastavit provádění úlohy. Můžete použít zkratku 'stop'
ctrl + z
zastavit (ale ne zabít) práci. Úloha bude přidána do fronty úloh, ale dokud v ní neobnovíte, již ji neuvidíte. Tato úloha může být obnovena později pomocí příkazu na popředífg
.Kromě toho můžete také jednoduše pozastavit úlohu pomocí
ctrl + s
. Úloha a její výstup zůstávají v popředí terminálu a použití shellu není vrácena uživateli. Úlohu lze obnovit stisknutímctrl + q
.Pokud pracujete v grafickém prostředí s mnoha otevřenými terminály, může se vám hodit klávesové zkratky pro kopírování a vkládání výstupu. Chcete-li to provést, použijte následující zkratky:
# Zkopíruje zvýrazněný text
ctrl + shift + c
# Vloží text do vyrovnávací paměti
ctrl + shift + vPředpokládejme, že ve výstupu provádějícího příkazu vidíte, že se provádí jiný příkaz, a chcete získat další informace. Existuje několik způsobů, jak to udělat. Pokud je tento příkaz někde ve vaší cestě, můžete spustit
which
Chcete-li zjistit, kde se tento příkaz na vašem disku nachází:[root@arch ~]$ což je
/usr/bin/lsS těmito informacemi můžete zkontrolovat binární soubor pomocí
file
příkaz:[root@arch ~]$ soubor /usr/bin/ls
/usr/bin/ls:ELF 64bitový LSB koláčový spustitelný soubor x86-64, verze 1 (SYSV), dynamicky propojený, interpret / lib64/ld-linux-x86-64.so.2, pro GNU/Linux 3.2.0, BuildID[sha1]=d4e02b88e596e4f82c6cc62a5bc4ce5827209a49, zbavenýMůžete vidět nejrůznější informace, ale pro většinu uživatelů je nejdůležitější
ELF 64-bit LSB
nesmysl. To v podstatě znamená, že se jedná o předkompilovaný binární soubor na rozdíl od skriptu nebo jiného typu spustitelného souboru. Související nástroj, který můžete použít ke kontrole příkazů, jecommand
nástroj samotný. Stačí spustitcommand -V <command>
vám poskytne různé typy informací:Příkaz [root@arch ~]$ -V ls
ls má alias na `ls --color=auto`
Příkaz [root@arch ~]$ -V bash
bash je /usr/bin/bash
[root@arch ~]$ příkaz -V shopt
shopt je vestavěný shellV neposlední řadě je jedním z mých oblíbených triků, zejména při práci s kontejnery nebo v prostředích, kde mám malé znalosti nebo kontrolu,
echo
příkaz. Tento příkaz lze použít ke všemu, od kontroly až po ověření vašehofor
smyčka spustí očekávanou sekvenci, která vám umožní zkontrolovat, zda jsou otevřené vzdálené porty. Syntaxe je velmi jednoduchá pro kontrolu otevřeného portu:echo > /dev/<udp or tcp>/<server ip>/<port>
. Například:user@ubuntu-1604:~$ echo> /dev/tcp/192.168.99.99/222
-bash:connect:Připojení odmítnuto
-bash:/dev/tcp/192.168.99.99/ 222:Připojení odmítnuto
user@ubuntu-1604:~$ echo> /dev/tcp/192.168.99.99/22Pokud je port uzavřen pro typ připojení, které se pokoušíte vytvořit, zobrazí se
Connection refused
zpráva. Pokud je paket úspěšně odeslán, nedojde k žádnému výstupu.Doufám, že díky těmto tipům bude Bash efektivnější a příjemnější. V Bash se skrývá mnohem více triků, než jsem zde uvedl. Jaké jsou vaše oblíbené?
Příloha 1. Seznam probraných tipů a triků
# Historie související
ctrl + r (zpětné vyhledávání)
!! (znovu spusťte poslední příkaz)
!* (znovu použijte argumenty z předchozího příkazu)
!$ (použijte poslední argument posledního příkazu)
shopt -s histappend (umožňuje více terminálům zapisovat do souboru historie )
historie | awk 'BEGIN {FS="[ \t]+|\\|"} {tisk $3}' | seřadit | uniq -c | seřadit -č | head (seznam nejpoužívanějších příkazů historie)
# Soubor a navigace
cp /home/foo/realllylongname.cpp{,-old}
cd -
přejmenovat 's/text_to_find/been_renamed/' *.txt
export CDPATH='/var/log:~' (proměnná se používá s vestavěným cd.)
# Colourize bash
# povolit barvy
eval "`dircolors -b`"
# vynutí, aby ls vždy používal indikátory barev a typů
alias ls='ls -hF --color =auto'
#, aby příkaz dir fungoval trochu jako ve Windows (dlouhý formát)
alias dir='ls --color=auto --format=long'
# zvýraznění výsledků grep pomocí barvy
export GREP_OPTIONS='--color=auto'
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01; 33m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m' # konec informačního pole
export LESS_TERMCAP_so=$'\E[01;42;30m' # začít informační pole
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;36m'
# Bash zkratky
shopt -s cdspell (opravuje překlepy)
ctrl + _ (zpět)
ctrl + šipka (posun o slovo vpřed)
ctrl + a (začátek přesunutím kurzoru)
ctrl + e (posun kurzor na konec)
ctrl + k (sekne vše za kurzorem)
ctrl + l (vymaže obrazovku)
ctrl + q (obnoví příkaz, který je v popředí)
ctrl + s (pozastavení dlouho spuštěného příkazu v popředí)
ctrl + t (prohození dvou znaků)
ctrl + u (vystřihne vše před kurzorem)
ctrl + x + ctrl + e ( otevře příkazový řetězec v editoru, abyste jej mohli před spuštěním upravit)
ctrl + x + * (rozbalit glob/hvězda)
ctrl + xx (přesunout na opačný konec řádku)
ctrl + y (vloží z vyrovnávací paměti)
ctrl + shift + c/v (kopírovat/vložit do terminálu)
# Spouštění příkazů v sekvenci
&&(spustit druhý příkaz, pokud je první úspěšný)
; (spusťte druhý příkaz bez ohledu na úspěch prvního)
# Přesměrování I/O
2>&1 (přesměrování stdout a stderr do souboru)
# check pro otevřené porty
echo> /dev/tcp//
`` (použijte zpětné zaškrtnutí k vysvobození)
# Prozkoumat spustitelný soubor
který
soubor
příkaz -V(řekne vám, zda je vestavěný, binární nebo alias)
Linux