Что делает “должностное лицо 1>/var/opt/log/my_logs/MYPROG _'date '+ %Y%m%d _, % H%M%S " регистрируется 2> &1”, делают?

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

exec 1>/var/opt/log/my_logs/MYPROG_`date '+%Y%m%d_%H%M%S'`.log 2>&1
3
задан 24 April 2018 в 00:08

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 (что означает подобные Границе оболочки кроме 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 также к одному из стандартных потоков, так, чтобы был включен в файл.

8
ответ дан 1 December 2019 в 13:15

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

Похожие вопросы: