Как команда cat (без аргументов) дублирует свой стандартный ввод? - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь понять, как / почему команда cat выполняет синтаксический анализ своего стандартного ввода.

Когда я устанавливаю стандартный ввод cat в "infile.txt",stdin просто записывается в stdout:

~$ echo foo bar test > infile.txt 
~$ cat < infile.txt
foo bar test
~$

Это то, что я и ожидал.Тем не менее, когда я запускаю cat с его stdin, установленным в мой (p) tty, stdin дублируется на stdout до тех пор, пока не будет прочитано EOF:

~$ cat
foo bar test
foo bar test
input is duplicated
input is duplicated
^C
~$

Для каждой пары:

  • Первая строка отображается как пользовательские типы.(это НЕ записывается в stdout / stderr)
  • вторая строка создается, когда пользователь нажимает [enter].(это записано на стандартный вывод)

Как это возможно?Насколько я понимаю, sh анализирует обе вышеупомянутые команды таким образом, что cat вызывается с помощью (argc = 1, argv = ["cat"]).Итак, звонок на cat такой же.Если это так, то почему выходные данные не дублируются в примере ~$ cat < infile.txt?

Поскольку cat читает каждый символ из его стандартного ввода из infile.txt, не следует ли ТАКЖЕ печататьчитать символ (как это происходит в простом ~$ cat случае)?

Я смотрел на эту простую (ish) реализацию [1], но она не ведет себя так же, как в Ubuntu 18.04кошка.Он не распечатывает дублированные входы, как в простом примере ~$ cat.

[1] https://gist.github.com/pete/665971#file-unix7-cat-c

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

cat выводит свой вход только один раз.Это терминал, который также выводит пользовательский ввод.

Вы можете, например, отключить эхо терминала, набрав

stty -echo

, а затем (вслепую) запустить cat и начать печатать - без дублированиявыход.

0 голосов
/ 26 апреля 2019

В основном cat работает следующим образом:

while (block = read_block(input)) {
    write_block(block, output);
}

Размер блока зависит от того, является ли stdin tty или файлом.Когда stdin приходит из tty, ввод буферизуется строкой, в противном случае буферизируется блок.

...