Сохраните всю команду и весь вывод (использующий сценарий через терминалы)

В течение короткого промежутка времени я хочу сохранить историю команд и вывод каждой команды, которую я выполняю в любом терминале, который я открываю. Это должно все войти в тот же файл.

Так в основном я хочу выполнить команду (или отредактировать bashrc) таким образом, что я могу затем;

  • Открытый терминал № 1 и выполненный echo hello
  • Открытый терминал № 2 и тип ls
  • Близкий терминал № 1 и открытый терминал № 3 и тип whoami
  • Закройте все терминалы. Открытый терминал № 4 и тип команда для наблюдения всех команд, выполненных в порядке выше (echo hello, ls, whoami), плюс их вывод в порядке я выполнил команды.

Я мог в теории открывать каждый терминал и тип

screen -f output.txt

и затем

exit

прежде чем я закрыл каждый терминал, но я не хочу должным быть не забывать вводить тот каждый раз. Я просто хочу сделанный автоматически, пока я вручную не останавливаю его (или выполнением команды или обновлением bashrc).

Считайте вопрос тщательно прежде, чем объявить это дубликат. Я искал существующие вопросы и не нашел что-то эквивалентным (хотя его возможное я пропустил его).

2
задан 1 December 2018 в 22:39

1 ответ

Потенциальное решение

После некоторого исследования и экспериментирования, вот то, что я придумал:

logstuff(){

    while true; do

        case $1 in
            "on" ) exec > >( ( printf ">>>>> TIME:$(date) SHELLPID:$$;\n"; tee /dev/tty ; printf ">>>>>\n" ) >> logfile.txt) 2>&1 ;
                   break;;
            "off") exec > /dev/tty 2>&1 ;
                   break;;
                *) echo "Please type 'on' or 'off';;
        esac
    done
}

Эта функция удара должна быть помещена в Ваш ~/.bashrc и доступно для использования при открытии нового терминала или после издания source ~/.bashrc. Вход должен быть включен вручную через on и off аргументы.


ДЕМОНСТРАЦИЯ

Вот то, как это работает на практике:

Действительно наполните в оболочке 1:

<shell 1>$ logstuff on
<shell 1>$ stat /etc/passwd
  File: /etc/passwd
  Size: 2208            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 156236      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-01 20:24:02.620000000 +0000
Modify: 2018-10-31 01:33:42.701000999 +0000
Change: 2018-10-31 01:33:42.704998999 +0000
 Birth: -
<shell 1>$ logstuff off
<shell 1>$ 

Действительно наполните в оболочке 2:

< shell 2 >$ logstuff on
< shell 2 >$ echo "Hello World !"
Hello World !
< shell 2 >$ logstuff off
< shell 2 >$ 

Теперь рассмотрите logfile.txt:

<shell 1>$ cat logfile.txt 
>>>>> TIME:Sat Dec  1 21:43:00 UTC 2018 SHELLPID:2225;
<shell 1>$ stat /etc/passwd
  File: /etc/passwd
  Size: 2208            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 156236      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-01 20:24:02.620000000 +0000
Modify: 2018-10-31 01:33:42.701000999 +0000
Change: 2018-10-31 01:33:42.704998999 +0000
 Birth: -
<shell 1>$ >>>>> TIME:Sat Dec  1 21:43:11 UTC 2018 SHELLPID:2359;
< shell 2 >$ echo "Hello World !"
Hello World !
< shell 2 >$ logstuff off
>>>>>
logstuff off
>>>>>
<shell 1>$ 

Проблемы

  • Если logstuff on выпущен в обоих терминалах сначала, существует шанс выводов, искажаемых вместе. Путем это работает, то, что необходимо выйти logsutff on в оболочке 1, затем дайте команды там, затем выйдите logstuff on в оболочке 2.
  • Это использует замену процесса >( ), tee и подоболочка. Не самое изящное, ни эффективное из-за набора разветвления и дополнительного конвейера.
  • logfile.txt хранится в текущем рабочем каталоге. Это должно быть изменено на ~/logfile.txt или однако пользователь считает целесообразным.

Практические соображения

То, что спрашивает сам вопрос, несколько непрактично: хранение вывода от нескольких оболочек в один единственный файл означает хранение вывода команд от двух или больше абсолютно несвязанных сессий которые могут иметь различные переменные среды, различные рабочие каталоги, или работающий над различными файловыми системами; это означает, что существуют все из недостатка контекста, если Вы намереваетесь использовать такой текст журнала для отладки целей или решения проблемы.

Намного лучший подход должен был бы иметь script -f запишите в файлы журнала в одном определенном каталоге, потенциально с именами файлов таких журналов, к которым добавляют метку времени, или добавил оболочку PID. Другое решение - вместо того, чтобы иметь 3 различных терминала, просто используйте один - screen или мой любимый byobu-screen. Можно присоединить/отсоединить к единственной виртуальной tty сессии на экране, и он часто используется для поддерживания процессов в рабочем состоянии на удаленных серверах, где необходимо выйти из системы, но все еще нуждаться в сессии оболочки с выполнением tracebacks и выводом. Это может быть объединено с script также.

1
ответ дан 2 December 2019 в 04:39

Другие вопросы по тегам:

Похожие вопросы: