Невозможно перенаправить вывод в FreeBsd

Невозможно перенаправить вывод в FreeBsd

В системе 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

Связанный контент