Как сохранить все выходные данные команд и ошибки?

376
Alex Bender

Всем привет!

Мне нужно захватить все команды, stdout и stderr без каких-либо дополнений к командам.
Я имею в виду, что я должен сохранить / сохранить вывод этих:

  1. $ echo 'test'
  2. $ ls -l
  3. $ cat some_file

commands.file

  1. alex @ bender: / pwd $ echo 'test'
  2. alex @ bender: / pwd $ ls
  3. alex @ bender: / pwd $ cat some_file
  4. alex @ bender: / pwd $ fsdfsdfsd

stdout.file

  1. тестовое задание
  2. test.txt some_file
  3. некоторый контент файла

stderr.file

_4. fsdfsdfsd

Что касается первой части вопроса, я нашел скрипт, который использует ловушку и перед оценкой команды сохраняет команду для регистрации. Но как насчет хранения результатов? повторяю: это должно быть решено без каких-либо дополнений к команде. Я имею в виду, что после запуска скрипта мне не нужно писать, например, первую команду ls > log.file. Я хочу увидеть ее без " > log.file ".

Я пишу некоторый скрипт на Python, он работает как командная оболочка.

if name == ' main ':
user = os.getlogin ()
machine_name = os.uname () [1]

stdinbuff = open('commands', 'w')  stdoutbuff = open('outs', 'w')   command_string = 1  while command_string != '0':   a = user + '@' + machine_name + ":" + os.getcwd() + '>';  a = a.replace('/home/', '~/')  print a,  command_string = raw_input()  command_args = command_string.split()   proc = subprocess.Popen(command_args, stdout=subprocess.PIPE)  (out, err) = proc.communicate()  print out   stdinbuff.write(command_string+'\n')  stdoutbuff.write(out+'\n')   stdinbuff.close()  stdoutbuff.close() 

но в этой оболочке я не могу использовать автозаполнение, как в bash, и этот скрипт не может хранить все, что я хочу.

Может быть, кто-то может сказать мне, что я должен делать?

3

2 ответа на вопрос

1
noggerl

Maybe the screen tool can do the trick for you with the screen logging function. Just simply start screen in commandline and with the keys CTRL-a + H (first Combination of CTRL + a and then a capital H with SHIFT + H, just to clarify) everything will be logged in the file screenlog.0. The directory where the logfile is found depends on where you started screen, i. e. if you started screen in your $HOME then the logfile will be found there.

Отличное решение! Вы можете уточнить, что `A` это просто ключ` a`, но `H` относится к заглавной буквы` H`. Таким образом, комбинация фактически становится `CTRL-A`, а затем` SHIFT-H`. Tim 10 лет назад 0
Спасибо ** noggerl **, но, может быть, вы знаете другой способ сделать это, потому что в какой-то момент мне нужно исправить выход на лету .. Alex Bender 10 лет назад 0
Единственное решение, которое у меня есть, это запустить второй `экран`. В этом `screen` вы можете запустить скрипт, который исправляет выходные данные другого` screen` во время выполнения (то есть в python, может быть, шеллскрипт может это сделать). Может быть, я могу помочь вам немного больше, когда вы скажете мне, что вы пытаетесь сделать. @Tim: спасибо за подсказку, я отредактировал свое решение с вашими предложениями. noggerl 10 лет назад 0
1
Alex Bender

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