LINUX.ORG.RU

[нубие]про скрипты, stdin, фильтр


0

0

Как узнать если что-то на stdin? Например, скрипт может использоваться и как фильтр, и как не фильтр. И в в нем есть строчка с read, и вот если на stdin ничего не подается, то он остановится и будет ждать пока кто-то что-то наберет на клавиатуре, а это не нужно, нужно чтобы просто игнорировал этот блок и все.

anonymous

Ответ на: комментарий от PoMbl4

язык сценариев командной оболочки, bash

anonymous
()

твои желания непавильны.

Даже если на stdin подается что-то из пайпа, то может быть задержка.

Ближайшее что можно сделать -- проверить является ли stdin терминалом -- на линуксе это наверняка можно сделать посмотрев куда указывает симлинк /proc/$$/fd/stdin но это непортабелный кошмар

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> Ближайшее что можно сделать -- проверить является ли stdin терминалом -- на линуксе это наверняка можно сделать посмотрев куда указывает симлинк /proc/$$/fd/stdin но это непортабелный кошмар

Проще запустить tty -s

Jini ★★
()

Зачем телепатировать? Сделай, чтоб через аргументы/опции к скрипту можно было выбирать, что нужно делать.

stassats ★★★★
()

рекомендую обратный вариант: если нет аргумента-читать стдин

anonymous
()

принято соглашение -- если вместо имени файла стоит - (минус, дефис) это значит что нужно читать stdin

dilmah ★★★★★
()

> и вот если на stdin ничего не подается

то можно использовать таймаут

sh(1): read [-p prompt] [-t timeout] [-er] variable ...

детский сад

anonymous
()
Ответ на: комментарий от anonymous

> да и могут быть задержки и от конвейера

конечно. банально:

cat file | grep word | cmd

А word в файле первый раз встречается в 314159-й строке..

dilmah ★★★★★
()
Ответ на: комментарий от Jini

> Проще запустить tty -s

Типа так?

tty -s || {
read line &&
echo $line
}

жаль tty(1) не является встроенной
коммандой

Можно попробовать еще поиграться
с SIGTTIN, но у меня че-то не получилось
сделать обертку об фоновый процесс.

anonymous
()
Ответ на: комментарий от anonymous

> жаль tty(1) не является встроенной коммандой

реально туплю, даже в мане написано tty -s устарело в угоду test -t 0, т.е. в предыдущем примерчике стоит заменить `tty -s ||...' на `[ -t 0 ] ||...'

даже не догадывался, что встроенный test(1) умеет что-то подобное ;)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.