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 в комментарии.
&>>
является правильным синтаксисом в оболочке 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
}
Это уменьшает количество перенаправлений до одного, группируя команды, выходные данные которых должны быть перенаправлены, в фигурных скобках и перенаправляя эту составную команду как единое целое.
nohup "$@" 2>&1 | tee "$nohup_file"
Или вы можете открыть дескриптор файла в скрипте с помощью exec
и перенаправить stdout
и stderr
на этот дескриптор