Příkazovou řádku znáte. Ve Windows je CMD (a nově PowerShell), v Linuxu/Macu je to terminál zpřístupňující shell, v různých provedeních (bash, zsh, atd). Je velmi snadné tam prostě spustit jeden příkaz, ale co když jedním zadáním chcete spustit víc?
Windows (CMD)
Spuštění více příkazů za sebou bez ohledu na výsledek (&):
příkaz1 & příkaz2 & příkaz3 …
Postupně spoustí první, následně druhý, třetí, atd.
Spuštění dalšího příkazu jen při úspěchu předchozího (&&):
příkaz1 && příkaz2 && příkaz3 …
Spuštění dalšího příkazu jen při chybě předchozího (||):
příkaz 1 || příkaz 2
Tady se příkaz 2 spustí pouze pokud příkaz1 skončí chybou.
TIP: Co to znamená CLI? a pro připomenutí je vhodné i Co je to ten DOS? A příkazová řádka?
PŘÍKLAD: CMD (Windows) – záloha složky + hláška, jestli to vyšlo
robocopy C:\Data D:\Zalohy\Data /MIR && echo ZALOHA OK || echo ZALOHA SELHALA
Windows (PowerShell)
V PowerShellu fungují zvyklosti jako dále v Linux a podporováno je
- řetězení – ;
- spustit další jen při úspěchu předchozího – &&
- spustit další při neúspěchu předchozího – ||
Aby zmatku nebylo málo, starší PowerShell (5.1) používal $? a if, konkrétně takto:
if ($?) { Command2 } else { Command3 }
PŘÍKLAD: PowerShell – spusť backup skript, jen když existuje, jinak hláška
Test-Path C:\skripty\backup.ps1 && & C:\skripty\backup.ps1 || Write-Host "Backup skript nenalezen nebo selhal"
Linux/Mac OS (bash, zsh, sh – terminál)
Spuštění více příkazů za sebou (nezávisle na výsledku):
příkaz1; příkaz2; příkaz2
Background (& – běží na pozadí)
příkaz1 & příkaz2
Zde se příkaz1 spustí na pozadí a okamžitě také spustí příkaz2.
Spuštění dalšího příkazu jen při úspěchu předchozího (&&)
příkaz1 && příkaz2
Spuštění dalšího příkazu jen při chybě předchozího (||)
příkaz1 || příkaz2
POZNÁMKA: Můžete kombinovat.
příkaz1 && oříkaz2 || příkaz3
tj. zkus 1, když uspěje, udělej 2, jinak 3
Jde používat i složené závorky pro seskupování příkazů, takže například:
{ příkaz1; příkaz2; } || echo "Něco se pokazilo"
PŘÍKLAD: Bash (Linux/macOS) – bezpečná úprava configu + reload služby
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak &&
nano /etc/nginx/nginx.conf && sudo systemctl reload nginx
POZNÁMKA: V příkazové řádce funguje i roura/pipe (|) pro předání výstupu z jednoho programu do vstupu druhého a “<” a “>” pro vstup a výstup.
