Pokud chcete ovládat prostředí Bash na Linuxu, macOS nebo jiném systému podobnému UNIXu, jsou důležité speciální znaky (jako ~, *, | a >). Pomůžeme vám rozluštit tyto záhadné sekvence příkazů Linuxu a stát se hrdinou hieroglyfů.
Table of Contents
Co jsou speciální znaky?
Existuje sada znaků Bash shell léčí dvěma různými způsoby. Když je napíšete do shellu, fungují jako instrukce nebo příkazy a říkají shellu, aby provedl určitou funkci. Představte si je jako jednoznakové příkazy.
Někdy si prostě chcete vytisknout postavu a nepotřebujete, aby fungovala jako magický symbol. Existuje způsob, jak můžete použít postavu k tomu, aby reprezentovala sama sebe spíše než její speciální funkci.
Ukážeme vám, které postavy jsou „speciální“ nebo „meta-“ postavy, a také jak je můžete funkčně a doslova použít.
~ Domovský adresář
Vlnovka (~) je zkratka pro váš domovský adresář. To znamená, že do příkazů nemusíte zadávat úplnou cestu k domovskému adresáři. Ať jste kdekoli v souborovém systému, můžete pomocí tohoto příkazu přejít do svého domovského adresáře:
cd ~
Tento příkaz můžete také použít s relativními cestami. Pokud se například nacházíte někde v systému souborů, který není ve vaší domovské složce, a chcete přejít do archivního adresáře ve vašem pracovním adresáři, použijte k tomu vlnovku:
cd ~/work/archive
. Aktuální adresář
Tečka (.) představuje aktuální adresář. Vidíte to ve výpisech adresářů, pokud použijete volbu -a (all) s ls.
ls -a
Můžete také použít tečku v příkazech k reprezentaci cesty k vašemu aktuálnímu adresáři. Pokud například chcete spustit skript z aktuálního adresáře, nazvali byste jej takto:
./script.sh
To říká Bashovi, aby se v aktuálním adresáři podíval na soubor script.sh. Tímto způsobem nebude hledat v adresářích ve vaší cestě odpovídající spustitelný soubor nebo skript.
.. Nadřazený adresář
Dvojitá tečka neboli „dvojitá tečka“ (..) představuje nadřazený adresář vašeho aktuálního adresáře. Můžete to použít k posunutí o jednu úroveň výše ve stromu adresářů.
cd ..
Tento příkaz můžete také použít s relativními cestami – například chcete-li přejít o jednu úroveň výše ve stromu adresářů a poté vstoupit do jiného adresáře na této úrovni.
Tuto techniku můžete také použít k rychlému přesunu do adresáře na stejné úrovni ve stromu adresářů, jako je váš aktuální. Přeskočíte o jednu úroveň nahoru a poté se vrátíte o jednu úroveň zpět do jiného adresáře.
cd ../gc_help
/ Path Directory Separator
K oddělení adresářů v názvu cesty můžete použít dopředné lomítko (/) – často nazývané jen lomítko.
ls ~/work/archive
Jedno lomítko představuje nejkratší možnou cestu k adresáři. Protože vše ve stromu adresářů Linux začíná v kořenovém adresáři, můžete tento příkaz použít k rychlému přesunu do kořenového adresáře:
cd /
# Komentář nebo oříznutí řetězce
Nejčastěji používáte hash nebo znak čísla (#), abyste shellu řekli, že to, co následuje, je komentář, a neměl by na to reagovat. Můžete jej použít ve skriptech shellu a – méně užitečné – na příkazovém řádku.
# This will be ignored by the Bash shell
Ve skutečnosti však není ignorován, protože je přidán do vaší historie příkazů.
Můžete také použít hash k oříznutí proměnné řetězce a odstranění některého textu ze začátku. Tento příkaz vytvoří řetězcovou proměnnou nazvanou tento_řetězec.
V tomto příkladu přiřadíme text „Dave Geek!“ do proměnné.
this_string="Dave Geek!"
Tento příkaz používá echo k tisku slov „Jak na to“ do okna terminálu. Načte hodnotu uloženou v řetězcové proměnné přes a rozšíření parametrů. Protože připojujeme hash a text „Dave“, ořízne tuto část řetězce předtím, než je předán echo.
echo How-To ${this_string#Dave}
Tím se nezmění hodnota uložená v řetězcové proměnné; ovlivňuje pouze to, co je odesláno do echa. Můžeme použít echo k vytištění hodnoty proměnné řetězce ještě jednou a zkontrolovat toto:
echo $this_string
? Zástupný znak jednoho znaku
Bash shell podporuje tři zástupné znaky, z nichž jeden je otazník (?). Zástupné znaky se používají k nahrazení znaků v šablonách názvů souborů. Název souboru, který obsahuje zástupný znak, tvoří šablonu, která odpovídá řadě názvů souborů, nikoli pouze jednomu.
Zástupný znak otazníku představuje právě jeden znak. Zvažte následující šablonu názvu souboru:
ls badge?.txt
To se překládá jako „uveďte jakýkoli soubor s názvem, který začíná ‚odznakem‘ a za kterým následuje libovolný jednotlivý znak před příponou souboru.
Odpovídá následujícím souborům. Všimněte si, že některé mají čísla a některé písmena za částí názvu souboru „odznak“. Zástupný znak otazníku bude odpovídat písmenům i číslům.
Šablona názvu souboru však neodpovídá „badge.txt“, protože název souboru nemá mezi „badge“ a příponou souboru jediný znak. Zástupný znak otazníku se musí shodovat s odpovídajícím znakem v názvu souboru.
Můžete také použít otazník k vyhledání všech souborů s určitým počtem znaků v názvech souborů. Zde jsou uvedeny všechny textové soubory, které obsahují přesně pět znaků v názvu souboru:
ls ?????.txt
* Zástupný znak sekvence znaků
Můžete použít hvězdičku
ls badge*
zástupný znak pro libovolnou sekvenci znaků, včetně žádných znaků. Zvažte následující šablonu názvu souboru:
An
Odpovídá „badge.txt“, protože zástupný znak představuje jakoukoli sekvenci znaků nebo žádné znaky.
ls source.*
[] An
Znaková sada zástupný znak
Jak je uvedeno výše, otazník používáte k reprezentaci jakéhokoli jednotlivého znaku a hvězdičku k reprezentaci libovolné sekvence znaků (včetně žádných znaků). [] Zástupný znak můžete vytvořit pomocí hranatých závorek (
) a znaky, které obsahují. Příslušný znak v názvu souboru se pak musí shodovat alespoň s jedním ze znaků v sadě zástupných znaků.
ls badge_0[246].txt
An
ls badge_[01][789].txt
An
ls badge_[23][1-5].txt
An
; Oddělovač příkazů shellu
ls > count.txt; wc -l count.txt; rm count.txt
An
count.txt; wc -l count.txt; rm count.txt” příkaz v okně terminálu‘ width=”646″ height=”122″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>
Všimněte si, že druhý příkaz se spustí, i když selže první, třetí se spustí, i když selže druhý a tak dále.
cd ./doesntexist && cp ~/Documents/reports/* .
A
& Proces na pozadí
Po zadání příkazu v okně terminálu a jeho dokončení se vrátíte do příkazového řádku. Normálně to trvá jen chvíli nebo dvě. Ale pokud spustíte jinou aplikaci, jako je gedit, nemůžete používat okno terminálu, dokud aplikaci nezavřete.
gedit command_address.page &
A
Bash vám ukáže ID procesu toho, co bylo spuštěno, a poté vás vrátí na příkazový řádek. Poté můžete pokračovat v používání okna terminálu.
sortWhen a command has input redirected into it, it might behave differently than when it reads from a named file.
If we use wc to count the words, lines, and characters in a file, it prints the values, and then the filename. If we redirect the contents of the file to wc, it prints the same numeric values but doesn’t know the name of the file from which the data came. It cannot print a filename.
Here are some examples of how you can use wc:
wc words.txtwc> Output Redirection
You can use the right-angle bracket ( > ) to redirect the output from a command (typically, into a file); here’s an example:
ls > files.txtcat files.txtAn
files.txt" v okně terminálu." width="646" height="382" >
wc doesntexist.txt 2> errors.txtcat errors.txtA
errors.txt" v okně terminálu." width="646" height="122" >
| Trubka
„Trubka“ spojuje povely dohromady. Přebírá výstup z jednoho příkazu a předává jej dalšímu jako vstup. Počet odesílaných příkazů (délka řetězce) je libovolný.
Zde použijeme cat k vložení obsahu souboru words.txt do grep, který extrahuje každý řádek, který obsahuje malé nebo velké „C“. grep pak předá tyto řádky k třídění. řazení používá volbu -r (obrátit), takže seřazené výsledky se zobrazí v obráceném pořadí.
cat words.txt | grep [cC] | sort -rA
! Logické NOT a operátor historie
Vykřičník (!) je logický operátor, který znamená NE.
[ ! -d ./backup ] && mkdir ./backupV tomto příkazovém řádku jsou dva příkazy:
První příkaz je text v hranatých závorkách;Druhý příkaz je text, který následuje za dvojitým ampersandem &&.
První příkaz používá ! jako logický operátor. Hranaté závorky označují, že bude proveden test. Volba -d (adresář) testuje přítomnost adresáře s názvem backup. Druhý příkaz vytvoří adresář.
Protože dvojité ampersandy oddělují dva příkazy, Bash provede druhý pouze v případě, že první uspěje. To je však opak toho, co potřebujeme. Pokud je test pro adresář „backup“ úspěšný, nemusíme jej vytvářet. A pokud test „záložního“ adresáře selže, druhý příkaz nebude proveden a chybějící adresář nebude vytvořen.
Zde je logický operátor! Působí jako logické NE. Pokud je tedy test úspěšný (tj. adresář existuje), zobrazí se ! převrátí to na „NE úspěch“, což je neúspěch. Takže druhý příkaz není aktivován.
Pokud selže test adresáře (tj. adresář neexistuje), zobrazí se ! změní odpověď na „NE selhání“, což je úspěch. Spustí se tedy příkaz k vytvoření chybějícího adresáře.
To málo! zabalí spoustu úderů, když to potřebujete!
ls -l -d backupA
!24A
!!Následující příkaz znovu spustí předchozí příkaz:
$ Variabilní výrazy V prostředí Bash vytváříte proměnné pro uložení hodnot. Některé, jako proměnné prostředí,
vždy existují a můžete k nim přistupovat kdykoli otevřete okno terminálu. Tyto uchovávají hodnoty, jako je vaše uživatelské jméno, domovský adresář a cesta.
echo $USERecho $HOMEecho $PATHAn
ThisDistro=UbuntuMyNumber=2001echo $ThisDistroecho $MyNumberAn
Přidejte složené závorky ( {} ) kolem znaku dolaru a proveďte rozšíření parametru, abyste získali hodnotu proměnné a umožnili další transformace hodnoty.
MyString=123456qwertyTím se vytvoří proměnná, která obsahuje řetězec znaků, jak je znázorněno níže:
echo ${MyString}Pomocí následujícího příkazu odešlete řetězec do okna terminálu:
echo ${myString:6}Chcete-li vrátit podřetězec začínající na pozici 6 celého řetězce, použijte následující příkaz (je zde nulový posun, takže první pozice je nula):
echo ${myString:0:6}Pokud chcete echo podřetězec, který začíná na pozici nula a obsahuje dalších šest znaků, použijte následující příkaz:
echo ${myString:4:4}A
Citování speciálních znaků
Pokud chcete použít speciální znak jako doslovný (nespeciální) znak, musíte to říct shellu Bash. Tomu se říká citace a existují tři způsoby, jak to udělat.
Pokud text uzavřete do uvozovek („…“), zabrání to Bashovi v působení na většinu speciálních znaků a ty se pouze vytisknou. Jednou výraznou výjimkou je však znak dolaru ($). Stále funguje jako znak pro výrazy proměnných, takže do výstupu můžete zahrnout hodnoty z proměnných.
echo "Today is $(date)"Tento příkaz například vytiskne datum a čas:
echo 'Today is $(date)'Pokud text uzavřete do jednoduchých uvozovek („…“), jak je uvedeno níže, zastaví se tím funkce všech speciálních znaků:
echo "Today is $(date)"Chcete-li zabránit tomu, aby následující znak fungoval jako speciální znak, můžete použít zpětné lomítko ( ). Tomu se říká „uniknutí“ postavy; viz příklad níže:
Jen si představte speciální znaky jako velmi krátké příkazy. Pokud si zapamatujete jejich použití, může to nesmírně prospět vašemu porozumění shellu Bash – a skriptům jiných lidí.