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

17

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

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

command | tee -a "$log_file"

и

command >> logifle.log

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

    
задан j0h 30.07.2015 в 18:17
источник

2 ответа

17

, если вы обычно запускаете свой скрипт с 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 30.07.2015 в 18:24
источник
18

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

Использование 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. (Большинство оболочек автоматически устанавливают эту переменную).

    
ответ дан A.B. 30.07.2015 в 18:28