2013-02-27 3 views
0

Как и для redirect COPY of stdout to log file from within bash script itself, но я также хотел бы сохранить stdout как устройство TTY.tee к журналу в сценарии bash, сохраняя stdout как TTY

К примеру, у меня есть следующие сценарии:

/tmp/teed-off$ cat some-script 
#!/usr/bin/env ruby 

if $stdout.tty? 
    puts "stdout is a TTY" 
else 
    puts "stdout is NOT a TTY" 
end 
/tmp/teed-off$ cat wrapper 
#!/usr/bin/env bash 

exec > >(tee some-script.log) 

./some-script 

Когда я запускаю их, обертка съедает STDOUT в качестве TTY устройства:

/tmp/teed-off$ ./some-script 
stdout is a TTY 
/tmp/teed-off$ ./wrapper 
stdout is NOT a TTY 

Как я могу перевернуть это поведение вокруг так, что скрипт считает, что его в TTY даже при исполнении через обертку?

ответ

1

Это не будет тривиально, но я думаю, вы можете сделать это через псевдо-ttys. Я не уверен, что есть стандартный инструмент, кроме, возможно, expect, который сделает это за вас.

Это займет немного времени. У вас будет программа управления, которая откроет мастер псевдо-tty, а затем подчиненный. Ведомое устройство будет подключено к выходу ./some-script. Мастер будет считываться программой управления, которая будет копировать данные, которые он считывает от ведущего к файлу, и к стандартным выводам.

Я не пробовал кодировать это. Я не уверен, что вы можете сделать это со стандартными командами оболочки; Я не могу думать ни о чем. Итак, я думаю, что будет некоторая C-кодировка.

0

ищет dup2 он дублирует файловый дескриптор

INT dup2 (интермедиат oldfd, внутр newfd);

+0

Как вызов функции C поможет в вопросе о Ruby и shells? –

+0

Я бы хотел, чтобы вам не пришлось сбрасывать на C для сценария оболочки (или третьего), чтобы быть уверенным :( – Nevir

+0

мой плохой .. я думал, что это был dup2, был доступен в скрипте тоже ... – Pradheep