Добавление stdout и stderr в файл

cylgalad упомянул причину вашей ошибки в комментарии о том, что путь /home/user1/local_build/binотсутствует в системной переменной root PATH.

Причина вашей проблемы в том, что каталог /home/user1/local_build/binотсутствует в переменной secure_path. Чтобы добавить этот каталог в secure_path, вам нужно отредактировать файл /etc/sudoersи изменить содержимое в его содержимом по умолчанию.

ИЛИ альтернативно,

Чтобы решить эту проблему, вы можете либо запустить emacs, явно указав его полный путь в команде:

sudo /home/user1/local_build/bin/emacs /etc/apache2/sites-available/000-default.conf

или альтернативно

вы можете добавить путь /home/user1/local_build/bin/к корневому PATH. Просто поместите следующую строку в файл .bashrc, расположенный в каталоге ~/root/.

PATH=$PATH:~/home/user1/local_build/bin

Добавление каталога в root PATHне будет работать по причинам, упомянутым steeldriver в комментарии.

1
07.08.2019, 20:50
2 ответа

&>>является правильным синтаксисом в оболочке bashдля перенаправления как стандартного потока вывода, так и стандартного потока ошибок в файл в режиме добавления.

Я думаю, что может произойти то, что вы запускаете сценарий, используя sh, который в вашей системе не bash. Или вы используете версию bashболее раннюю, чем версия 4.0, которая является первой версией, поддерживающей &>>.

Другой способ сделать это, соответствующий стандарту, — использовать >>file 2>&1. В вашем случае

nohup "$@" >>"$nohup_file" 2>&1

Не существует более короткого способа сделать это в стандартной shоболочке.

Обратите внимание, что то, что вы предлагаете, 2>&1 >>file, находится задом наперед и не будет отправлять стандартный поток ошибок в файл, а туда, куда первоначально направлялся стандартный поток вывода . Перенаправления обрабатываются слева -на -справа, поэтому ваше перенаправление сначала отправит стандартную ошибку туда, куда идет стандартный вывод, а , а затем перенаправит стандартный вывод в файл. в режиме добавления. Другими словами, :второе перенаправление, >>fileне изменило бы направление стандартной ошибки, поэтому оно идет туда, куда изначально направлялся стандартный вывод из-за предыдущего 2>&1.


Альтернативным способом написания кода может быть

nohup_ntrs () {
  nohup_file="$HOME/teros/nohup/stdio.log"
  mkdir -p "$(dirname "$nohup_file")"

  {
    printf ' ------------- BEGIN %s -------------- \n' "$(date)"
    nohup "$@"
    printf ' ------------- END %s ---------------- \n' "$(date)"
  } >>"$nohup_file" 2>&1
}

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

4
27.01.2020, 23:22

nohup "$@" 2>&1 | tee "$nohup_file"

Или вы можете открыть дескриптор файла в скрипте с помощью execи перенаправить stdoutи stderrна этот дескриптор

0
27.01.2020, 23:22

Теги

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