Рішення
Ви хочете (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 .