Denna Bash-omdirigeringsknep ersätter echo ... | kommando

Lär dig använda inmatningsomdirigering i Bash för att effektivisera kommandon och skript, inklusive heredocs och härsträngar för bättre hantering av data.
Bash—och andra Linux-skal—stöder kraftfull kommandorörledning med hjälp av funktioner som omdirigering. Du kanske är van vid den mest grundläggande typen av inmatningsomdirigering, men som ofta är fallet har Linux mer djup än vad som först verkar.
Inmatningsomdirigering med <
Inmatningsomdirigering är en av de första avancerade skalteknikerna du sannolikt kommer att lära dig. Det är en mekanism som låter dig skicka data till ett kommando från en fil, istället för att skriva in det direkt eller leda det från en annan process.
De flesta program—cat, till exempel—accepterar ett filnamn som ett kommandoradsargument, om det är logiskt för dem att göra så:
cat filnamn Men andra—tr, till exempel—gör det inte. Enligt dess manual, "tr-verktyget kopierar standardinmatning till standardutmatning med substitution eller borttagning av valda tecken." Dess grundläggande användning ges som:
tr sträng1 sträng2 Så det finns två typiska sätt att använda tr: genom att skriva in data manuellt på kommandoraden eller, mer vanligt (speciellt i skript), genom att leda inmatning till det:
cat filnamn | tr sträng1 sträng2 Denna pipeline använder cat för att skicka innehållet i en fil till standardutmatning, men det finns ett bättre sätt, med hjälp av inmatningsomdirigering:
tr sträng1 sträng2 <filnamn Här öppnar symbolen den angivna filen med filbeskrivare 0, standardinmatning, vilket gör den tillgänglig för tr.
Härdokument med <<
Om du har gjort lite skalskriptning, eller arbetat med inmatning på kommandoraden, kan du ha stött på ett vanligt problem: hur man arbetar med flerlinjiga strängar. Även om du kan klara dig med escape-sekvenser och andra tillvägagångssätt, är härdokumentsyntaxen mycket mer praktisk:
#!/bin/bash cat <<SLUT Det här skriptet kommer att utföra en revision av din disk. Välj ett alternativ: 1. Fortsätt 2. Avsluta SLUT Ordet efter "SLUT" kan verka som en mycket annan åtgärd—att formatera en flerlinjig sträng till en rad—men heredocs är en form av inmatningsomdirigering. Notera att det här exemplet använder cat, inte echo. Medan echo skriver ut vadhelst argument du skickar till det, skriver cat ut standardinmatning, vilket är vad vi har att göra med här.
Du kan bekräfta detta genom att skicka ett heredoc till echo:
Ditt skal kommer att använda en annan prompt för att visa att det förväntar sig flerlinjig inmatning. Bash visar ett “>” medan zsh, som i ovanstående skärmdump, använder “heredoc>.”
Echo-programmet gör inget med standardinmatning, så inget händer i det här fallet. Du kommer att se samma brist på utdata om du kör den motsvarande pipelinen:
echo "hej, världen" | echo Cat-programmet, å sin sida, skickar inmatning till standardutmatning:
Den mystiska <<< och härsträngar
Även om du är en heredoc-mästare kanske du inte är medveten om denna sista typ av inmatningsomdirigering: härsträng. Den är faktiskt mycket lik den flerlinjiga versionen, men med en enda rad istället:
cat <<< "hej, världen" Cat kommer att misslyckas eftersom det är motsvarigheten till echo hej, | cat världen. Se till att citera din härsträng om den innehåller mellanslag.
Eftersom denna syntax förväntar sig en enlinjig sträng finns det inget behov av en avgränsare. Precis som härdokument kan härsträngen utföra variabelsubstitution, så den är så mångsidig som du behöver den att vara:
grep -q /usr/bin <<< $PATH Så, vad är nyttan med det? För att börja med, är detta tillvägagångssätt lite mer robust och effektivt än sin motsvarighet:
echo "hej, världen" | echo När ett kommando dirigeras, öppnar ditt skal en underprocess för att köra det och kopplar inmatning och utmatning mellan de två som lämpligt. Detta är en ovärderlig process mestadels, men för enkla fall som att föra text från ett kommando till ett annat är det inte alltid nödvändigt. Att använda en härsträng undviker denna överhead.
En härsträng kan också fungera som bättre dokumentation, som mer exakt återspeglar avsikten med ett kommando.
Kommando som echo eller cat ger input, här-strängen gör detta arbete helt på egen hand, och den gör det jobbet så att syftet är tydligt.
Av denna anledning är det också bekvämt att använda som en platshållare. Till exempel, detta kommando söker text efter ett givet mönster:
grep "mönster" <<< "någon text att söka" När du konstruerar mönstret, kan du vilja använda dummytext för att testa det med, vilket här-strängen låter dig göra enkelt. När du sedan har avslutat förfiningen av mönstret, kan du ersätta det med inputomdirigering från en fil:
grep "mönster" < filnamn Det övergripande kommandot är nästan identiskt, så konsekvens bibehålls och det slutgiltiga kommandot blir lättare att formulera.
Ibland är dock här-strängen mer än bara en bekvämlighet; det är en nödvändighet. Ta read inbyggda kommando som exempel:
echo 'hej' | read hälsning Avsikten här är att $hälsning ska få värdet hej, men så sker inte:
Eftersom read körs i en sub-shell, är hälsning-variabeln inte tillgänglig för den inkallande shellen, så inputen går förlorad. Men, med en här-sträng, fungerar allt som du vill:
Nu när du har läst klart Denna Bash-omdirigeringsknep ersätter echo ... | kommando, inbjuder vi dig att utforska kategorin Linux ytterligare. Där hittar du fler intressanta artiklar som kommer att utöka dina kunskaper och hålla dig informerad. Sluta inte läsa och upptäcka mer!

Lämna ett svar