Jak połączyć stdin z łańcuchem, w ten sposób?
echo "input" | COMMAND "string"
i dostać
inputstring
Trochę hacky, ale może to być najkrótszy sposób na zrobienie tego, o co pytałeś w pytaniu (użyj potoku, aby zaakceptować stdout
od echo "input"
jako stdin
do innego procesu / polecenia:
echo "input" | awk '{print $1"string"}'
Wynik:
inputstring
Jakie zadanie dokładnie próbujesz wykonać? Więcej kontekstu może dać ci więcej wskazówek co do lepszego rozwiązania.
Aktualizacja - odpowiadanie na komentarz:
@NoamRoss
Bardziej idiomatyczny sposób robienia tego, co chcesz, to:
echo 'http://dx.doi.org/'"$(pbpaste)"
$(...)
Składni nazywa zastąpienie polecenia . Krótko mówiąc, wykonuje polecenia zawarte w nowej podpowłoce i zastępuje swoje stdout
dane wyjściowe miejscem, w którym $(...)
została wywołana w powłoce nadrzędnej. W efekcie otrzymujesz:
echo 'http://dx.doi.org/'"rsif.2012.0125"
pbpaste | awk '{print "http://dx.doi.org/"$1}'
i otrzymujęhttp://dx.doi.org/10.1098/rsif.2012.0125
'{print $0"string"}'
do złapania całości.string
do każdej linii. Spróbujecho 'input'\n'another line' | awk '{print $0"string"}'
.użyj
cat -
do czytania ze standardowego wejścia i wstaw go,$()
aby pozbyć się końcowego znaku nowej liniiJednak dlaczego nie upuścisz potoku i nie złapiesz wyjścia z lewej strony w zamianie poleceń:
źródło
Często używam potoków, więc zwykle jest to łatwy sposób na prefiks i sufiks stdin:
źródło
pipe
icat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
:? Lub bardziej czytelna wersja:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Możesz to zrobić za pomocą seda:
W twoim przykładzie:
źródło
Jest na to kilka sposobów, osobiście uważam, że najlepszym jest:
Innym sposobem może być zastąpienie „$” (znak końca wiersza) ciągiem w poleceniu sed:
Dlaczego wolę to pierwsze? Ponieważ natychmiast łączy ciąg na stdin, na przykład za pomocą następującego polecenia:
natychmiast otrzymasz pierwszy wynik:
a następnie po 5 sekundach pojawi się drugie echo:
Z drugiej strony, używając „sed” najpierw wykonuje całą zawartość nawiasu, a następnie przekazuje ją „sed”, więc polecenie
wyświetli obie linie
po 5 sekundach.
Może to być bardzo przydatne w przypadkach, gdy wykonujesz wywołania funkcji, których wykonanie zajmuje dużo czasu i chcesz być na bieżąco aktualizowany o wynikach funkcji.
źródło
Wiem, że to opóźnienie o kilka lat, ale możesz to osiągnąć za pomocą opcji xargs -J:
A ponieważ jest to xargs, możesz to zrobić w wielu wierszach pliku jednocześnie. Jeśli plik „names” ma trzy linie, na przykład:
Mógłbyś:
źródło
-J
że nie wydaje się być standardowy / powszechny. W systemie Linux (gdziexargs
jest częśćGNU findutils
) pojawia się błąd: wxargs: invalid option -- 'J'
którym systemie to działa?-J
dotyczy wersji na komputery Mac. W przypadku Linuksa-I
pełni tę samą funkcję.cat names | xargs -I% echo "I like % because he is nice"
IOW: nie ma potrzeby-n 1
(xargs
wywołaniaecho
raz na wiersz wejścia i tak, ponieważ-I
implikuje-L1
). Ponadto, wszystkie oddzielne cytowania argumentów wydają się zbędne.Polecenie, które wysłałeś, użyłoby łańcucha „input” jako strumienia wejścia standardowego COMMAND, co nie dałoby wyników, których szukasz, chyba że COMMAND najpierw wydrukowałby zawartość swojego wejścia standardowego, a następnie wypisał 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
Dzięki podstawianiu poleceń możesz mieć taką linię poleceń:
Spowoduje to najpierw oszacowanie polecenia COMMAND z "ciągiem" jako danymi wejściowymi, a następnie rozszerzenie wyników wykonania tego polecenia na wiersz, zastępując to, co znajduje się między znakami '`'.
źródło
echo input $(COMMAND "string")
, a nie odwrotnych apostrofów. Powodzenia wszystkim.kot będzie moim wyborem:
ls | cat - <(echo new line)
źródło
Działa również:
Wygeneruje ciągi takie jak:
...
źródło