Разница между конвейером и расширением команд

Это может вас заинтересовать .

По сути, вам нужно определить, есть ли в терминале 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 .

2
20.12.2018, 01:58
2 ответа
A|B

выполняет A и B (параллельно ), и стандартный вывод A подается на стандартный ввод B. В случае

A $(B)

оболочка сначала выполняет B, собирает стандартный вывод B, затем выполняет A, но для этого выполнения назначает отдельные слова вектору ARGV -A (, т.е. A может получить доступ к этим словам с помощью обычного argv механизм, известный из C и других языков ).

Кроме того, что в обоих случаях задействованы две программы А и Б, я не вижу между ними ничего похожего.

4
27.01.2020, 22:02

Первый расширяется до vi <list_of_filenames>.

Второй напрямую передает имена файлов в vi. Предположительно, viтак работать не будет. Вы, конечно, можете направить текст в vim, но он интерпретируется как текст для обработки, а не само имя файла. (Вы должны использовать vim -. См. man vimдля получения дополнительной информации.)

0
27.01.2020, 22:02

Теги

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