Как проверить, ли stdin от терминала или канала в сценарии оболочки?

Первое поле должно включать тип монтирования и имя корзины, например,

s3fs#mybucket /path/to/mountpoint fuse _netdev,allow_other 0 0

У s3fs README есть другие примеры.

29
задан Ciro Santilli 新疆改造中心法轮功六四事件 13 June 2018 в 10:25
поделиться

4 ответа

Если я правильно понял вопрос, вы можете попробовать следующее:

#!/bin/sh
if [ -t 0 ]; then
    echo running interactivelly
else
    while read -r line ; do
        echo $line
    done
fi
45
ответ дан dmedvinsky 28 November 2019 в 01:20
поделиться

Вы можете легко реализовать поведение, аналогичное команде «cat», которая читается из списка предоставленных файлов или, если они не предоставлены, затем считывается из стандартного ввода.

Хотя вы можете не использовать эту идею, я думаю, что эта статья в Linux Journal будет вам интересна http://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or -трубопровод

: -)

7
ответ дан darkturo 28 November 2019 в 01:20
поделиться

Чтобы ответить на вопрос буквально (но не то, что вы на самом деле хотите): read -t 0

Таймаут, 0 секунд.

  1. это гоночное условие, зависящее от того, когда левая сторона будет готова предоставить данные. Вы можете указать -t 5, но на трэшевой системе даже это проблематично.
  2. read -t не стандартизован в SUSv3. Он есть в BSD sh, bash, zsh. Его нет в ksh или dash.

Так что вы не можете просто использовать #!/bin/sh и ожидать, что это будет работать.

Основная проблема в том, что даже если сейчас на stdin ничего нет, это не значит, что скоро не будет. Вызов программы обычно оставляет stdin подключенным к терминалу/что угодно, так что нет способа сказать, что нужно.

Итак, чтобы ответить на ваш вопрос буквально, вы можете это сделать, но на практике ваши варианты таковы:

  1. проверить, является ли stdin tty: [ -t 0 ]
  2. использовать argv для контроля поведения
8
ответ дан 28 November 2019 в 01:20
поделиться

Если вы никогда не хотите запускать сценарий в интерактивном режиме, пусть он принимает входной файл в качестве параметра, а не использует stdin . Некоторые программы используют флаг или специальное имя файла, чтобы указать, что они должны принимать ввод из стандартного ввода, а не из файла; этот случай позволяет при необходимости справиться с подменой командной строки.

Если вы хотите, чтобы ваш скрипт принимал стандартный ввод, почему бы вам не сделать его интерактивным (или, по крайней мере, вести себя как другие инструменты POSIX)?

1
ответ дан 28 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: