Er is een onderscheid tussen commandoregelargumenten en standaardinvoer. Een pipe verbindt standaarduitvoer van het ene proces met standaardinvoer van een ander. Dus
ls | echo
Verbindt standaarduitvoer van ls met standaardinvoer van echo. Prima, toch? Nou, echo negeert de standaard invoer en dumpt zijn commandoregel argumenten - die er in dit geval geen zijn - naar zijn eigen stdout. De uitvoer: helemaal niets.
Er zijn een paar oplossingen in dit geval. Eén is om een commando te gebruiken dat stdin leest en dumpt naar stdout, zoals cat.
ls | cat
Zal ‘werken’, afhankelijk van wat je definitie van werken is.
Maar hoe zit het in het algemene geval. Wat je echt wilt is stdout van een commando converteren naar command line args van een ander commando. Zoals anderen al hebben gezegd, is xargs
in dit geval het canonieke hulpprogramma, dat de commandoregelargumenten voor een commando uit zijn stdin leest, en commando’s samenstelt om uit te voeren.
ls | xargs echo
Je zou dit ook wat kunnen omzetten, met het substitutie commando $()
echo $(ls)
Zou ook doen wat je wilt.
Beide tools zijn de kern van shell scripting, je zou ze allebei moeten leren.
Voor de volledigheid, zoals je in de vraag aangeeft, de andere basismanier om stdin om te zetten in commandoregel args is het ingebouwde read
commando van de shell. Het converteert “words” (woorden zoals gedefinieerd door de IFS
variabele) naar een temp variabele, die je kunt gebruiken in elke commandorun.