Альтернатива, больше как любопытство. Если GNU awk
включен, date
не нужно:
awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'
Программа знает, указаны ли файлы на ее командной строке. Это не может знать, существует ли какой-либо вход, доступный на stdin (кроме путем попытки считать его), и если там вводится, нет никакого пути к программе, чтобы знать, был ли тот вход предназначен для него. Таким образом, единственная разумная опция состоит в том, чтобы иметь четкое правило, на основе того, как программа была вызвана (параметры командной строки, переменные среды, конфигурационные файлы, …), чтобы решить, будет ли это читать из stdin или нет.
Например, типичные текстовые утилиты (cat
, sort
, grep
, awk
, perl -p
, …) чтение от stdin, если никакой файл не обеспечивается и читается из указанного файла (файлов), если существует кто-либо. Интерпретаторы повинуются подобной конвенции, например sh
без аргументов читает команды из стандартного входа в то время как sh script_file_name
чтения управляют из указанного файла (и листы stdin, чтобы быть считанным сценарием, если он хочет). Существует также общая конвенция это если -
появляется в положении, где название входного файла ожидается, программа будет читать из stdin.
Рассмотрите отрывок оболочки как
somecommand | while read line; do
process "$line"
done
Необходимо знать ли process
чтения от stdin или нет. Нет такой вещи как “тестирование, обеспечивается ли stdin”: это там, но пользователь, который вызывает программу, знает, хочет ли он, чтобы stdin был считан или нет.
Ответ, который я нашел, это - то, как он разработан. Если Вы хотите читать и из stdin и из использования файла echo foobar | grep f - test.txt
. от man grep
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.