«tee» позволяет нам перенаправлять вывод из команды — есть ли какой-либо простой способ вывода командной строки, которая выполняется сама по себе?

#linux #unix

#linux #unix

Вопрос:

При многократном просмотре файлов журнала я задаюсь вопросом, какие параметры / параметры я использовал при выполнении данной команды, которая сгенерировала этот файл журнала.

Есть ли какой-нибудь простой способ вывести командную строку, которая выполняется сама по себе, в стандартный вывод, который будет перенаправлен в файл журнала в верхней части файла?

Комментарии:

1. echo this_is_my_command >>logfile ?

2. Помимо уже упомянутого set -x , вы можете создать оболочку, подобную verbose(){ printf '>>'; printf ' %s' "$@"; echo; "$@"; } then verbose cmd arg | tee logfile (в отличие set -x от этого, команды будут выводиться в стандартный вывод, а не в стандартный вывод).

Ответ №1:

Вы можете повторить команду, передать ее в файл, передать его, а затем добавить вывод в файл с помощью sh tee -a myfile :

 echo "ls -la" | tee myfile | sh | tee -a myfile
  

В стандартном выводе вы видите только вывод команды, но в myfile первой строке есть ls -la , а следующие строки содержат вывод команды.

Комментарии:

1. Вау — несколько хитрых маневров — удивлен, что у зрелых платформ, таких как unix / linux, нет более простого способа добиться этого.

Ответ №2:

В скрипте, который записывает в файл журнала, используйте set -x , который печатает в STDERR выполняемые команды. Используйте set x для возврата к поведению по умолчанию (без печати команд).

Пример:

Скрипт test.sh :

 #!/usr/bin/env bash

echo "INFO: test log message 1"
set -x
echo "INFO: test log message 2"
set  x
echo "INFO: test log message 3"
  

Запустите скрипт:

 ./test.sh 1>test.log 2>amp;1
  

Вывод в test.log :

 INFO: test log message 1
  echo 'INFO: test log message 2'
INFO: test log message 2
  set  x
INFO: test log message 3
  

СМОТРИТЕ ТАКЖЕ:
Отладка сценариев Bash