В течение короткого промежутка времени я хочу сохранить историю команд и вывод каждой команды, которую я выполняю в любом терминале, который я открываю. Это должно все войти в тот же файл.
Так в основном я хочу выполнить команду (или отредактировать bashrc) таким образом, что я могу затем;
echo hello
ls
whoami
echo hello
, ls
, whoami
), плюс их вывод в порядке я выполнил команды.Я мог в теории открывать каждый терминал и тип
screen -f output.txt
и затем
exit
прежде чем я закрыл каждый терминал, но я не хочу должным быть не забывать вводить тот каждый раз. Я просто хочу сделанный автоматически, пока я вручную не останавливаю его (или выполнением команды или обновлением bashrc
).
Считайте вопрос тщательно прежде, чем объявить это дубликат. Я искал существующие вопросы и не нашел что-то эквивалентным (хотя его возможное я пропустил его).
После некоторого исследования и экспериментирования, вот то, что я придумал:
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
также.