1

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

root@host:# sh script.sh

тогда вывод будет

Its installing
Its done

Но теперь мой сценарий выглядит

root @ host:# sh script.sh
Его установка
Отображение результатов работы сценария интернета
Это сделано

Как я знаю, команда stty -echo скрывает стандартный вывод в терминале, а stty echo включает стандартное отображение в терминале. Но как я могу скрыть вывод stander с помощью сценария оболочки?

1 ответ1

1

Перенаправьте stdout и stderr в /dev/null:

> /dev/null 2>&1

ИЛИ в bash:

&> /dev/null

Вы можете сделать это для всех программ, созданных вашим скриптом, используя exec с перенаправлением в начале вашего скрипта.

exec > /dev/null 2>&1

Если программы, которые вы вызываете в своем скрипте, не обращаются к терминалу напрямую (редко), это должно охватывать вас.

Одно замечание о перенаправлениях: порядок имеет значение. Это должно быть > /dev/null 2>&1 , НЕ 2>&1 >/dev/null . Раньше я думал, что последний будет работать, потому что > выглядит как стрелка, которая заставляет меня думать об указателях (как и слово "перенаправление"), и если я указываю stderr на stdout, а затем указываю stdout на /dev /null, тогда оба должны указывать на /dev /null. Это не тот случай, хотя. Файловые дескрипторы не являются указателями, и более полезно думать о них > как о присваивании дескриптору файла, а не о указании. (Вроде того, потому что технически fd - это просто число, и вам нужны системные функции, такие как dup2 чтобы открыть другой файл в том же файловом дескрипторе; но я думаю, что назначение - это хорошая высокоуровневая абстракция).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .