2015-02-06 2 views
1

Существуют программы, которые меняют свой выход в зависимости от того, является ли их 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.

+0

'$ stdin.tty' (не требуя ничего, с помощью ввода-вывода #tty?) возвращает 'true'. – steenslag

ответ

2

Вы не можете написать ttypipe, потому что труба является трубой и никогда не может быть tty. Тем не менее, вы можете написать ttyexec с немного другой синтаксис:

ttyexec ls > output 

Это открыло бы псевдо-терминал, запустите ls в нем, и не копировать ничего ls пишет на терминал в ttyexec «s стандартный вывод.

Lo и вот, есть такой инструмент, как этот: script. Он открывает программу в новом, скрытом для входа PTY взаимодействия с ним, но мы можем игнорировать протоколирование часть и использовать только свои терминальные открытия свойств:

$ touch a b c 

$ ls 
a b c 

$ script -q -c 'ls' /dev/null > output 

$ cat output 
a b c output 
+0

Спасибо. Вот как я завершил реализацию этого https://github.com/JoshCheek/dotfiles/compare/84a7b01c58aa3ee3ba8a93f9199c1375e3671894...10f801b1e82205dcffd40a4f5c9402b857368929 –

Смежные вопросы