
В системе Freebsd я запускаю свой bash-скрипт с попыткой перенаправить вывод:
% sudo bash some_file.sh arg1 >/dev/null 2>&1
Ambiguous output redirect.
% sudo bash some_file.sh arg1 &> /dev/null
Invalid null command.
решение1
Похоже, вы используете csh в командной строке (проверьте с помощью echo $SHELL
).
- Либо используйте синтаксис csh для перенаправления как stdout, так и stderr:
sudo bash some_file.sh arg1 >& /dev/null
- Или переместите перенаправление в «bash-часть» команды с помощью
sudo bash -c 'some_file.sh arg1 >/dev/null 2>&1'
решение2
Вы были близки, но ни один из этих вариантов не является правильным синтаксисом для оболочки TENEX C.
Помните: интерактивная оболочка входа, которую вы используете на FreeBSD, если вы ее не изменили, — это оболочка TENEX C. Ваше перенаправление команды sudo
должно использовать синтаксис перенаправления оболочки TENEX C. Не имеет значения, что вы запускаете оболочку Bourne Again через sudo
. Это определяется толькопосле того, как перенаправление произошло и sudo
уже было запущено.
Этот:
% sudo bash некоторый_файл.sh arg1 >/dev/null 2>&1фактически то же самое, что и
% >/dev/null >&1 sudo bash некоторый_файл.sh arg1 2который пытается дважды перенаправить стандартный вывод в два разных места.
Этот:
% sudo bash некоторый_файл.sh arg1 &> /dev/nullна самом деле
% sudo bash некоторый_файл.sh arg1 & > /dev/nullи будет перезаписана как таковая в вашей истории команд. Это две команды, соединенные
&
, sudo
и команда без имени и аргументов. Последняя не допускается в оболочке TENEX C.
Вот как перенаправить стандартный вывод и стандартную ошибку /dev/null
в оболочке TENEX C:
% sudo bash некоторый_файл.sh arg1 >& /dev/null