Нет, это невозможно.
На уровне ОС конвейеры реализуются с помощью системных вызовов mkfifo()
, dup2()
, fork()
и execve()
. Это не обеспечивает способ сообщить программе, какие команды связаны с ее стандартным вводом. Действительно, не гарантируется, что будет строкой, представляющей конвейер программ, используемых для генерациивообще stdin, даже если ваш stdin действительно FIFO, подключенный к stdout другой программы;может случиться так, что этот конвейер был сгенерирован программами, вызывающими execve()
и непосредственно друзьями.
Лучший доступный обходной путь - это инвертировать ваш процесс.
Это не то, что вы просили, но этото, что вы можете получить.
#!/usr/bin/env bash
printf -v cmd_str '%q ' "$@" # generate a shell command representing our arguments
while IFS= read -r line; do
printf 'Output from %s: %s\n' "$cmd_str" "$line"
done < <("$@") # actually run those arguments as a command, and read from it
... а затем ваш скрипт start , из которого он читает, вводит данные, а не получает их на стандартный ввод.
...после того, ./yourscript ls -l
или ./yourscript sh -c 'ls -l | grep -i readme'
.(Конечно, никогда не используйте это, кроме как в качестве примера; см. ParsingLs ).