Что делает "exec 1>/var/opt/log/my_logs/MYPROG_`date '+%Y%m%d_%H%M%S'`.log 2>&1"?

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

exec 1>/var/opt/log/my_logs/MYPROG_`date '+%Y%m%d_%H%M%S'`.log 2>&1

1 ответ

На самом деле происходит 4 важных события:

  1. exec встроенный используется для перенаправления всего вывода для сеанса командной строки в файл

  2. 1><FILENAME> говорит оболочке перенаправить stdout стандартный поток, то есть нормальный без ошибок вывод команд <FILENAME>, > создаст, если <FILENAME> не существует или обрезается, если <FILENAME> уже существует.

  3. Перенаправленное имя файла создается с помощью добавленных обратных галочек с date '+%Y%m%d_%H%M%S' команда. Обратные галочки являются формой подстановки команд и функционально эквивалентны $(date '+%Y%m%d_%H%M%S') форма, и в наши дни $(...) предпочтительнее для удобочитаемости и потому, что эта форма может быть легко вложена (то есть иметь несколько уровней). Так что выход date с указанным форматом '+%Y%m%d_%H%M%S' создаст имя файла с меткой времени. Если ваша команда выполняется в 2018 году, 4 июля, 4:20:20, вывод будет /var/opt/log/my_logs/MYPROG_20180704_042020.log,

  4. 2>&1 переадресовывает stderr поток в этот файл также, это стандарт, POSIX-совместимый (что означает Bourne-подобные оболочки, кроме bash понимаю это) форма. Это функционально эквивалентно&> специфичный для bash синтаксис. Порядок указанных перенаправлений в оболочке важен, поэтому, почему это появляется после 1> Перенаправление.

В заключение, не должно быть никаких выходных данных самой этой команды. Для перехода в указанный вами файл нужно всего лишь перепрограммировать два потока вывода всех последовательных команд.

Интересно, что с этой командой мой bash 4.4 выводит все в файл, включая подсказку и все, что я печатаю (поэтому здесь мне пришлось вводить вслепую echo hello world и нажмите Ctrl+D, чтобы выйти потом):

$ bash --posix
bash-4.4$ exec 1>./mylog_`date '+%Y%m%d_%H%M%S'`.log 2>&1
$ cat ./mylog_20180424_010800.log 
bash-4.4$ echo hello world
hello world
bash-4.4$ exit

Делая это по частям, показывает, что bash выходы подсказывают stderr поток и удивительно наряду с чем-либо, что я печатаю:

bash-4.4$ exec 1> ./mylog.txt
bash-4.4$ echo Hello World
bash-4.4$ cat ./mylog.txt
cat: ./mylog.txt: input file is output file
bash-4.4$ exec 2>&1

В случае ksh происходит то же самое, но я вижу, что набирается, только файл отправляется в файл, т. е. стандартный ввод не перенаправляется:

bash-4.4$ ksh
$ exec 1>./mylog 2>&1
echo hello askubuntu
bash-4.4$ cat ./mylog
$ hello askubuntu
$ 
bash-4.4$ 

Итак, здесь мы можем видеть, что оболочки могут выбрать для вывода подсказки PS1 также к одному из стандартных потоков, так что он включается в файл.

Другие вопросы по тегам