Либо будет работать, если команда поддерживает чтение из стандартного ввода (форма command
tcsh
поддерживает команду ed(1)
, например, считывает команды из стандартного ввода, поэтому не может прочитать файл из стандартного ввода.
На уровне C команда, которая считывает данные из стандартного ввода или именованного файла, будет выполнять что-то вроде
#include <err.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fhandle;
// option processing here ...
if (argc == 0 || strncmp(*argv, "-", (size_t) 2) == 0) {
fhandle = stdin;
} else {
if ((fhandle = fopen(*argv, "r")) == NULL)
err(1, "could not open '%s'", *argv);
}
// read from fhandle here, which is either from stdin or a file ...
}
Некоторые команды требуют, чтобы форма -
указывала на чтение из стандартного ввода, другие будут делать это автоматически (как в вышеупомянутом коде), когда список аргументов пуст. Иначе код в любом случае будет иметь дело с fhandle
и не заботится о том, откуда поступают входные данные (если только сообщение об ошибке не должно включать имя файла, но это может быть застрять в дополнительной переменной).