Что делает "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 важных события:
exec
встроенный используется для перенаправления всего вывода для сеанса командной строки в файл1><FILENAME>
говорит оболочке перенаправитьstdout
стандартный поток, то есть нормальный без ошибок вывод команд<FILENAME>
,>
создаст, если<FILENAME>
не существует или обрезается, если<FILENAME>
уже существует.Перенаправленное имя файла создается с помощью добавленных обратных галочек с
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
,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
также к одному из стандартных потоков, так что он включается в файл.