Существуют программы, которые меняют свой выход в зависимости от того, является ли их stdout tty. Поэтому, если вы помещаете их в конвейер или перенаправляете их, вывод отличается от того, что он будет в вашей оболочке. Вот пример:Как сделать stdin tty?
$ touch a b c
# when running ls alone, it places them on one line
$ ls
a b c
# when stdout is not a tty, it places them on their own line
$ ls > output
$ cat output
a
b
c
output
Так что, если я хочу, чтобы показать кому-то, что команда, как это должно выглядеть (например, я пишу учебник), я должен выделить и скопировать выход из терминала и затем сохраните его в файл.
Похоже, что я должен быть в состоянии сделать что-то вроде этого:
ls | ttypipe > output
Где ttypipe
гипотетическая программа которого STDIN (и, следовательно, стандартный вывод Ls в) отвечает верно, когда его спросили, если это терминал.
Я знаю, что в Ruby, я могу сделать что-то вроде этого:
require 'pty' # => true
IO.pipe.map(&:tty?) # => [false, false]
PTY.open.map(&:tty?) # => [true, true]
Но это для дочернего процесса, а не текущий процесс, так как результат:
$stdin.tty? # => false
I может exec, я не могу придумать, как это повлиять на дескриптор файла stdin.
'$ stdin.tty' (не требуя ничего, с помощью ввода-вывода #tty?) возвращает 'true'. – steenslag