На всякий случай, если кому-то интересно, вот что я сделал, чтобы решить эту проблему.
Исправление:
sudo setfacl -R -b
Это рекурсивно (-R) удаляет все (-b) разрешения acl
Я также получал предупреждение о групповой записи для следующих файлов:
/var/lib/sudo/lectured
/var/lib/sudo/ts
Исправление:
sudo chmod 700
для обоих файлы и исправляют разрешения, а также исправляют предупреждения
Команда nohup
- это команда, которую вы фактически выполняете в этом случае. Слово firefox
не интерпретируется оболочкой как команда; он просто передается в качестве аргумента nohup
. То, что команда nohup
делает с этим аргументом, «не является делом оболочки».
Конечно, nohup
принимает этот аргумент и запускает его как команду.
Дело в том, что то, что вы на самом деле делаете с точки зрения оболочки, перенаправляет вывод nohup
, не вывод firefox
.
Однако nohup
будет делать разные вещи с выводом выполняемой команды, в зависимости от того, куда указывает его собственный вывод. Из спецификаций POSIX для nohup
(выделено мной):
Если стандартный вывод - это терминал , весь вывод записывается названной утилитой по стандарту вывод должен быть добавлен в конец файла nohup.out в текущем каталоге. Если nohup.out не может быть создан или открыт для добавления, вывод должен быть добавлен в конец файла nohup.в каталоге, указанном переменной среды HOME. ...
Если стандартная ошибка - это терминал и стандартный вывод открыт, но не является терминалом , весь вывод, записанный указанной утилитой в ее стандартную ошибку, должен быть перенаправлен в то же описание открытого файла, что и стандартный вывод. ...
Итак, из-за некоторой внутренней магии nohup
, ваши перенаправления работают должным образом, если вы запустите:
nohup utility >/dev/null &
Обратите внимание, что вам не нужно перенаправлять оба stderr
и stdout
, поскольку команда nohup
перенаправит stderr
из утилиты в зависимости от того, где находится nohup
собственный вывод указывает на. (Не говоря уже о том, что &>
не переносится.)
Также существует проблема переносимости вашего ввода. Поскольку ваш stdin
подключен к вашему терминалу, то, что с ним произойдет, зависит от реализации. (См. Примечание в разделе «Обоснование» в спецификациях nohup
POSIX .) Вместо этого вам может быть лучше использовать:
nohup firefox >/dev/null </dev/null &
И, как уже упоминалось в комментариях, с nohup
или любую другую команду, в которой вы должны когда-либо помещать перенаправление после фонового &
.
Я бы начал с раздела SHELL GRAMMAR на странице руководства для bash
:
Простые команды
Простая команда представляет собой последовательность необязательных присваивания переменных, за которыми следуют слова, разделенные пробелами, и перенаправления , и завершаются оператором управления .
Таким образом, перенаправление ( &> / dev / null
) выполняется первым, а за ним следует оператор управления ( &
).
Править: И чтобы сделать ответ полным, nohup
является первой частью простой команды . Это не имеет особого значения в bash
.
Точно ваш пример (кроме / dev / null
, который только усложняет его):
jakuje@E6430:/tmp$ rm nohup.out out
jakuje@E6430:/tmp$ nohup sleep 1 & &>out
[1] 10876
nohup: ignoring input and appending output to ‘nohup.out’
[1]+ Done nohup sleep 1
jakuje@E6430:/tmp$ cat nohup.out # empty
jakuje@E6430:/tmp$ cat out # empty
jakuje@E6430:/tmp$ rm nohup.out
jakuje@E6430:/tmp$ nohup sleep 1 &>out &
[1] 10882
[1]+ Done nohup sleep 1 &> out
jakuje@E6430:/tmp$ cat nohup.out # no file
cat: nohup.out: No such file or directory
jakuje@E6430:/tmp$ cat out # output of nohup
nohup: ignoring input