Есть ли способ эффективно сделать это в Bash:
/my/bash/script < echo 'This string will be sent to stdin.'
Я знаю, что мог бы передать вывод от эха, такого как это:
echo 'This string will be piped to stdin.' | /my/bash/script
bash
redirect
stdin
io-redirection
Все работники необходимы
источник
источник
echo
>
форма перенаправления откроет дескриптор файла как fd0
(stdin), тогда как|
opens запускает дочерний процесс и присоединяет его stdout (fd 1) к stdin другого процесса. Этот факт может иметь нетривиальные последствия (думать о разделении переменных окружения?)Ответы:
Вы можете использовать одну линию
heredoc
выше то же самое, что
или вы можете перенаправить вывод из команды, как
или вы можете прочитать как
или просто
источник
echo -e "\x01\x02..." | ./script
)<<<
? Мне стыдно признаться, что я никогда не видел этого раньше, и я полностью озадачен этим. Я попробовал Googling для этого, но мои результаты не были связаны.Вы были близки
Для многострочного ввода здесь подходят документы:
Редактировать К комментариям:
Для достижения двоичного ввода, скажем
Если заменить
cat
на/my/bash/script
(или даже уронить последнюю трубку), это печатает:Или, если вы хотите что-то более вызывающее:
Что является синусом первых 90 градусов в 4-байтных двоичных числах?
источник
xxd -r
(илиod
), чтобы отфильтровать ЗДЕСЬ документВы также можете использовать
read
как этоисточник
Решение
Вы хотите (1) создать вывод stdout в одном процессе (например
echo '…'
) и (2) перенаправить этот вывод на ввод stdin другого процесса, но (3) без использования механизма bash pipe. Вот решение, которое соответствует всем трем условиям:<
Является нормальным для перенаправления ввода стандартного ввода. Это<(…)
замена процесса bash. Примерно он создает/dev/fd/…
файл с выводом замещающей команды и передает это имя файла вместо<(…)
, приводя здесь, например, вscript < /dev/fd/123
. Подробнее см. Этот ответСравнение с другими решениями
Однострочный heredoc, отправляемый в stdin,
script <<< 'string'
позволяет отправлять только статические строки, но не выводить другие команды.Одна только подстановка процесса, например, in
diff <(ls /bin) <(ls /usr/bin)
, ничего не отправляет в stdin. Вместо этого выходные данные процесса передаются как содержимое файлов, созданных в фоновом режиме, что эквивалентно, напримерdiff /dev/fd/10 /dev/fd/11
,. В этой командеdiff
не получает ввода от stdin.Случаи использования
Мне нравится это, в отличие от конвейерного механизма,
< <(…)
механизм позволяет помещать команду первым и весь ввод после нее, как стандарт для ввода из параметров командной строки.Однако, помимо эстетики командной строки, в некоторых случаях нельзя использовать механизм трубы. Например, когда определенная команда должна быть предоставлена в качестве аргумента другой команде, например, в этом примере с
sshpass
.источник
<<<
?Позволяет вводить в программу несколько строк, не сохраняя эти данные в истории и не видя их в
ps
. Просто нажмите Ctrl + C, когда закончите печатать, чтобы закончитьcat
.источник
источник
function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }
. В-третьих, этот sed был бы намного более понятен с помощью awk:awk -F '\n' 'ORS=" " { print } END { printf "\n"}'