Как связать stdin с строкой, например?
echo "input" | COMMAND "string"
и получим
inputstring
Как связать stdin с строкой, например?
echo "input" | COMMAND "string"
и получим
inputstring
Немного взломанный, но это может быть самый короткий способ сделать то, что вы задали в вопросе (используйте трубку для принятия stdout
от echo "input"
как stdin
к другому процессу/команде:
echo "input" | awk '{print $1"string"}'
Вывод:
inputstring
Какую задачу вы пытаетесь выполнить? Больше контекста может помочь вам в более эффективном решении.
Обновление - ответ на комментарий:
@NoamRoss
Чем больше идиоматический способ делать то, что вам нужно, тем ниже:
echo 'http://dx.doi.org/'"$(pbpaste)"
Синтаксис $(...)
называется заменой команд. Короче говоря, он выполняет команды, заключенные в новую подоболочку, и заменяет вывод stdout
на то, где $(...)
был вызван в родительской оболочке. Таким образом, вы получите, по сути:
echo 'http://dx.doi.org/'"rsif.2012.0125"
используйте cat -
для чтения из stdin и поместите его в $()
, чтобы выбросить конечную новую строку
echo input | COMMAND "$(cat -)string"
Однако почему бы вам не отбросить канал и захватить вывод левой стороны в подстановке команд:
COMMAND "$(echo input)string"
Я часто использую каналы, так что это простой способ добавить префикс и суффикс stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
Вы можете сделать это с помощью sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
В вашем примере:
echo input | sed 's/.*/\0string/'
Есть несколько способов добиться этого, я лично считаю, что лучше всего:
echo input | while read line; do echo $line string; done
Другой может быть, заменив "$" (конец строки) на "string" в команде sed:
echo input | sed "s/$/ string/g"
Почему я предпочитаю первое? Поскольку он мгновенно объединяет строку в stdin, например, со следующей командой:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
вы сразу получаете первый вывод:
input_one string
а затем через 5 секунд вы получите другое эхо:
input_two string
С другой стороны, используя "sed", сначала он выполняет все содержимое скобки, а затем дает команду "sed", поэтому команда
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
выводит обе строки
input_one string
input_two string
через 5 секунд.
Это может быть очень полезно в случаях, когда вы выполняете вызовы функций, которые занимают много времени, и вы хотите постоянно обновлять информацию о выходе функции.
Я знаю, что это несколько лет спустя, но вы можете выполнить это с помощью опции xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
И поскольку это xargs, вы можете сделать это сразу на нескольких строках файла. Если имя файла имеет три строки, например:
Adam
Bob
Charlie
Вы можете сделать:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
Команда, которую вы отправили, будет использовать строку "input" в качестве потока COMMAND stdin, который не даст результатов, которые вы ищете, если COMMAND сначала не распечатало содержимое своего stdin, а затем распечатало аргументы командной строки.
Кажется, что вы хотите сделать, ближе к подстановке команд.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
При подстановке команд у вас может быть такая командная строка:
echo input `COMMAND "string"`
Сначала будет оцениваться COMMAND с "string" в качестве входных данных, а затем развернуть результаты выполнения этих команд на строку, заменив что-то между "символами".
Также работает:
seq -w 0 100 | xargs -I {} echo "string "{}
Будет генерировать строки вроде:
string 000
string 001
string 002
string 003
string 004
...