Я пытаюсь понять, как / почему команда 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