Я пытаюсь понять то, что ниже части сценария оболочки делает. Я знаю, что должностное лицо без любых аргументов перенаправляет вывод текущей оболочки, но не может понять то, что ниже команды делает:
exec 1>/var/opt/log/my_logs/MYPROG_`date '+%Y%m%d_%H%M%S'`.log 2>&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 (что означает подобные Границе оболочки кроме 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
то же самое происходит, но я вижу то, что вводится, только подсказка переходит к файлу, т.е. stdin не перенаправляется:
bash-4.4$ ksh
$ exec 1>./mylog 2>&1
echo hello askubuntu
bash-4.4$ cat ./mylog
$ hello askubuntu
$
bash-4.4$
Таким образом, здесь мы можем отчасти видеть, что оболочки могут принять решение произвести подсказку PS1
также к одному из стандартных потоков, так, чтобы был включен в файл.