Рішення
Ви хочете (1) створити висновок stdout в одному процесі (як echo '…'
) і (2) перенаправити цей вихід на stdin вхід іншого процесу, але (3) без використання механізму bash pipe. Ось рішення, яке відповідає всім трьом умовам:
/my/bash/script < <(echo 'This string will be sent to stdin.')
<
Є нормальним для перенаправлення вводу стандартного введення. <(…)
Є заміною процесу Баша. Приблизно він створює /dev/fd/…
файл з результатом команди, що замінює, і передає це ім'я замість <(…)
, в результаті чого, наприклад, в script < /dev/fd/123
. Детальніше дивіться у цій відповіді
Порівняння з іншими рішеннями
Однорядковий гередок, що надсилається до stdin, script <<< 'string'
дозволяє лише надсилати статичні рядки, а не вихід інших команд.
Сам процес заміни, наприклад, в diff <(ls /bin) <(ls /usr/bin)
, нічого не посилає stdin. Натомість вихідний процес передається як вміст файлів, створених у фоновому режимі, еквівалентний, наприклад diff /dev/fd/10 /dev/fd/11
. У цій команді diff
не отримує введення даних від stdin.
Використовуйте випадки
Мені подобається, що, на відміну від механізму труби, < <(…)
механізм дозволяє ставити команду першим і весь вхід після неї, як це стандарт для введення з параметрів командного рядка.
Однак, крім естетики командної лінії, є деякі випадки, коли механізм труби не може бути використаний. Наприклад, коли певна команда повинна бути надана як аргумент іншій команді, наприклад, у цьому прикладі зsshpass
.