Это может вас заинтересовать .
По сути, вам нужно определить, есть ли в терминале stdin или какой-то канал / перенаправление. Для этого вы можете использовать функцию isatty
.
int main(void){
char buffer[N];
int sum;
/* Load buffer from stdin with fgets, fread, read, ... */
if(!isatty(fileno(stdin)))
printf("%s\n", buffer);
/* Compute sum... */
printf("The sum is %d.\n", sum);
}
В этом случае, когда stdin не является tty (что означает, что ввод не был введен), программа распечатывает буфер перед вычислением суммы.
В моей системе функция isatty
объявлена в unistd.h
. Вам также понадобится stdio.h
, чтобы получить fileno
.
A|B
выполняет A и B (параллельно ), и стандартный вывод A подается на стандартный ввод B. В случае
A $(B)
оболочка сначала выполняет B, собирает стандартный вывод B, затем выполняет A, но для этого выполнения назначает отдельные слова вектору ARGV -A (, т.е. A может получить доступ к этим словам с помощью обычного argv механизм, известный из C и других языков ).
Кроме того, что в обоих случаях задействованы две программы А и Б, я не вижу между ними ничего похожего.
Первый расширяется до vi <list_of_filenames>
.
Второй напрямую передает имена файлов в vi
. Предположительно, vi
так работать не будет. Вы, конечно, можете направить текст в vim
, но он интерпретируется как текст для обработки, а не само имя файла. (Вы должны использовать vim -
. См. man vim
для получения дополнительной информации.)