Есть ли способ для функции рыбы прочитать необязательный ввод из канала?

Есть ли способ прочитать данные, которые были переданы функции, изнутри функции, но только если они есть? Я пробовал это с кошкой следующим образом:

function myPipe
    set -l pipe_input (cat -)
    echo $pipe_input # is never reached
end
echo test | myPipe

Однако это приводит к тому, что функция останавливается и ожидает ввода конвейера, даже если данные действительно передавались в функцию.

Я хотел бы, чтобы рыба выполняла остальную часть функции, даже если нет ввода канала, чтобы я мог обрабатывать передаваемые данные.


person TheUnseen    schedule 27.09.2019    source источник
comment
Вам нужно предоставить больше контекста. Что делать, если стандартный ввод подключен к файлу или fifo? Зачем вам это нужно? Обратите внимание, что в оболочках POSIX вы должны использовать для этого test -p 0. Однако, начиная с fish 2.7, это не работает. Я не могу сказать, было ли это исправлено в более новой версии.   -  person Kurtis Rader    schedule 27.09.2019


Ответы (2)


Вы можете проверить, подключен ли стандартный ввод к каналу:

if isatty stdin
    set -l pipe_input ""     # not a pipe or redirection
else
    set -l pipe_input (cat -)
end

Ссылка: https://fishshell.com/docs/current/commands.html#isatty< /а>

person glenn jackman    schedule 27.09.2019

Наконец-то я понял, как читать необязательный ввод в скрипте fish:

Проблема с set -l pipe_input (cat /dev/stdin) заключается в том, что он будет ожидать ввода, если канал '/dev/stdin' пуст, и, следовательно, остановит выполнение в этот момент (без ввода канала).

  • Поэтому вам просто нужно перебрать поток:

cat /dev/stdin | while read line; set --append pipe_input "$line"; end

  • Затем вы можете легко продолжить и проверить, имеет ли переменная (массив/список) содержимое:

    if test (count $pipe_input) -gt 0; echo "got pipe input: $pipe_input"; else echo "empty pipe"; end

person TheUnseen    schedule 14.11.2019