Есть ли простой способ регистрировать все действия, которые выполняет сценарий оболочки?

18

Есть ли простой способ записать все действия, которые происходят от сценария оболочки в файл?

У меня есть сценарий. Он выводит такие вещи, как эхо "инструкции", а также вывод других программ. Я знаю команды:

command | tee -a "$log_file"

и

command >> logifle.log

Я спрашиваю, есть ли параметр оболочки для ведения журнала, команда set, которую я могу использовать, или что-то в этом роде. Я не обязательно хочу добавлять десятки перенаправлений или тройник в файлы, если мне не нужно. Я все еще хочу получить вывод std, хотя - я просто хочу, чтобы он был зарегистрирован .:wq

j0h
источник
5
LOL
,: WQ,
1
меня поражает, что большинство людей, кажется, делают это вместо: х
извиниться и восстановить Монику

Ответы:

18

если вы обычно запускаете свой скрипт с помощью foo.sh, попробуйте запустить его (при условии, что это скрипт bash) с помощью bash -x foo.sh. Если вы хотите, чтобы все перенаправлялось в файл, попробуйте bash -x foo.sh > file.log 2>&1(обратите внимание, что я также перенаправляю stderr, удалите, 2>&1если вы этого не хотите). Если вы хотите увидеть , что происходит, bash -x foo.sh 2>&1 | tee log.file.

roadmr
источник
20

Есть очень простой и удобный способ:

Использование scriptдля создания машинописи терминальной сессии

  1. Запустите команду script

    Если аргумент fileзадан, например script ~/tmp/output, scriptсохраняет диалог в этом файле. Если имя файла не указано, диалог сохраняется в файлеtypescript

  2. Запустите ваш скрипт или что вы хотите начать

  3. Если ваш скрипт закончен, остановитесь scriptчерез Ctrl-D

  4. Проверьте вывод в файле вывода по умолчанию typescript


Чтобы запустить команду за один шаг script, используйте параметр-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

Использование scriptвнутри вашего скрипта не имеет смысла, потому что scriptразветвляется или запускает новую оболочку.

Если переменная SHELL существует, то оболочкой, разветвленной сценарием, будет эта оболочка. Если SHELL не установлен, предполагается, что оболочка Bourne. (Большинство оболочек устанавливают эту переменную автоматически).

AB
источник
4
@ Fabby Мне нравится мой ответ, но я не вижу маленькую серую вещь;)
AB
Я использую script logfilename, так что я могу выбрать это.
вальтинатор
я могу вызвать "скрипт" из моей программы оболочки?
15:30
1
Это не имеет смысла, смотрите мой улучшенный ответ.
AB
1
+1. Спасибо за этот ответ :-) scriptполезен также мониторинг через fifo. From man script: " -f, --flushСбрасывать вывод после каждой записи. Это хорошо для телеоперации: один человек делает mkfifo foo; script -f foo, а другой может контролировать в реальном времени, что делается с помощью cat foo". Он также может быть использован для мониторинга, когда программа ожидает ввода или выполняется, например, путем отслеживания метки времени fifo.
Судодус