2012-12-14 12 views

Odpowiedz

71

Trochę hacky, ale to może być najkrótsza droga do tego, co pytasz w pytaniu (użyć rury przyjąć stdout z echo "input" jak stdin do innego procesu/polecenia:

echo "input" | awk '{print $1"string"}' 

wyjściowa:

inputstring 

Jakie zadania są dokładnie chce osiągnąć? Więcej kontekst może Ci więcej na kierunku lepszego rozwiązania.

Update - odpowiadając na komentarz:

@NoamRoss

Im bardziej idiomatycznych sposób robienia tego, co chcesz, to wówczas:

echo 'http://dx.doi.org/'"$(pbpaste)" 

Składnia $(...) nazywa command substitution. W skrócie, wykonuje polecenia zawarte w nowej podpowłoce i zastępuje jego wyjście stdout miejscem, w którym $(...) zostało wywołane w powłoce macierzystej.Więc co można uzyskać w efekcie:

echo 'http://dx.doi.org/'"rsif.2012.0125" 
+1

Dzięki! Działa to świetnie. Dokładne zadanie, które próbuję wykonać, polega na pobraniu ciągu znaków ze schowka (DOI) i dodaniu do niego adresu URL, więc robię to za pomocą 'pbpaste | awk "{print" http://dx.doi.org/ "$ 1}" i uzyskaj 'http: // dx.doi.org/10.1098/rsif.2012.0125' –

+0

@NoamRoss zaktualizowana odpowiedź; seem edit;) –

+3

@ sampson-chen, użyłbym ''{print $ 0" string "}", aby pobrać całą rzecz. –

3

Komenda ty pisał zajęłoby ciąg „Input” używać go jako stdin strumienia komendę, która nie przyniosą oczekiwanych rezultatów, którego szukasz, chyba że polecenie pierwszy wydrukowany zawartość jego stdin, a następnie wydrukowane jego argumenty wiersza poleceń.

Wygląda na to, że to, co chcesz zrobić, jest bardziej zbliżone do zastępowania poleceń.

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

Z podstawienia polecenia można mieć wiersza poleceń tak:

echo input `COMMAND "string"` 

To będzie pierwszy ocenić polecenie z „string” jako wejście, a następnie rozwiń wyniki, które nakazuje wykonanie na kolumnę linii, zastępując to, co jest pomiędzy znakami "."

+0

i oczywiście @NaomRoss, chyba że wymagane do korzystania z Bourne shell lub mają inne crazy „przenoszenia” mandaty, będziesz korzystać z nowoczesnego podstawienia polecenia jak 'wejściowego echo $ (polecenie„string”) ', zamiast odgłosów. Powodzenia wszystkim. – shellter

34

użytku cat - czytać ze standardowego wejścia, i umieścić go w $() wyrzucić przełamane spływu

echo input | COMMAND "$(cat -)string" 

Jednak dlaczego nie upuścić i rury chwycić wyjście z lewej strony w taktycznej polecenia:

COMMAND "$(echo input)string" 
+0

Oto praktyczny przykład: znajdź ~/other_program/lib -name "* .jar" | tr '\ n' ':' | echo "$ (cat -) ~/java_app/classes" –

+0

To działa dla mnie w bashu, ale w zsh pojawia się "cat: -: Input/output error". Jakiś pomysł, co może to spowodować? – jaymmer

9

można to zrobić z sed:

seq 5 | sed '$a\6' 
seq 5 | sed '$ s/.*/\0 6/' 

W przykładzie:

echo input | sed 's/.*/\0string/' 
8

Istnieje kilka sposobów osiągnięcia tego, osobiście uważam, najlepiej jest:

echo input | while read line; do echo $line string; done 

Innym może być przez podstawienie „$” (koniec linii znak) z "ciągiem" w poleceniu sed:

echo input | sed "s/$/ string/g" 

Dlaczego preferuję ten pierwszy? Ponieważ skleja ciąg do stdin natychmiast, na przykład za pomocą następującego polecenia:

(echo input_one ;sleep 5; echo input_two) | while read line; do echo $line string; done 

masz natychmiast pierwsze wyjście:

input_one string 

a następnie po 5 sekundach można dostać drugą echo:

input_two string 

Z drugiej strony, używając "sed" najpierw wykonuje całą treść nawiasów, a następnie daje ją "sed", więc polecenie

(echo input_one ;sleep 5; echo input_two) | sed "s/$/ string/g" 

wyjście obydwie linie

input_one string 
input_two string 

po 5 sekundach.

Może to być bardzo przydatne w przypadkach, gdy wykonywane są połączenia z funkcjami, których wykonanie zajmuje dużo czasu i które wymagają ciągłej aktualizacji na temat wyjścia tej funkcji.

+0

W rzeczywistości opcja _sed_ przetwarza również natychmiast każdą linię wejścia. – tomekwi

4

wiem, że to kilka lat spóźnione, ale można tego dokonać z xargs -J opcji:

echo "input" | xargs -J "%" echo "%" "string" 

A ponieważ jest xargs, można to zrobić na wielu liniach pliku natychmiast.Jeśli „nazwy” plik ma trzy linie, takie jak:

Adam 
Bob 
Charlie 

Można zrobić:

cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice" 
+1

Wygląda fajnie, z wyjątkiem '-J' nie wydaje się być standardowe/wspólne. W systemie Linux (gdzie 'xargs' jest częścią' GNU findutils') pojawia się błąd: 'xargs: niepoprawna opcja - 'J''' Który system jest włączony? – arielf

+2

'-J' jest dla wersji Mac. Dla Linux '-I' wykonuje tę samą funkcję. – user2635263

+1

Dzięki! bardzo przydatne. Zwróć uwagę, że w systemie Linux ta uproszczona wersja działa równie dobrze: 'cat names | xargs -I% echo "Lubię%, ponieważ jest miły" 'IOW: nie ma potrzeby użycia' -n 1' ('xargs' wywołuje' echo' raz w każdym wierszu wejścia, ponieważ '-I' zawiera' -L1 ') Także wszystkie oddzielne cytowania arg wydaje się być zbędne. – arielf

17

Jestem często za pomocą rur, więc to wydaje się być łatwym sposobem prefiks i sufiks stdin :

echo "my standard in" | cat <(echo "prefix... ") <(cat -) <(echo " ...suffix") 
prefix... my standard in ...suffix 
+0

Dzięki! To naprawdę bardzo fajny przykład użycia 'pipe' i' cat' –

+0

To powinno być najlepszą odpowiedzią –

+0

Dlaczego nie tylko: "echo" mój standard w "| echo -e "prefiks \ n $ (cat -) \ n" "? Lub, bardziej czytelna wersja: 'echo" mój standard w "| printf "% s \ n% s \ n% s \ n" "prefiks" "$ (cat -)" "sufiks" ' – MiniMax