Как я могу подавить вывод команды в bash, не делая ее переменную пустой

#bash #stderr #io-redirection

Вопрос:

 check="$(cat "$HOME/log.txt" | grep 'some_string')"

if [ -z "${check}" ] ; then
  echo "string not found"
else
  echo "string found"
fi
 

В моем скрипте bash я проверяю строку в файле , и он выводит, была ли строка найдена или нет, проверяя, пуста ли переменная или нет . Довольно просто .
Так что дело в том, что когда это $HOME/log.txt файл отсутствует , он выводит

 cat: /home/user/log.txt: No such file or directory
string not found
 

На самом деле здесь не так , но я хочу подавить сообщение «Такого файла или каталога нет», я просто подумал о том, чтобы использовать amp;>/dev/null команду cat для подавления этого, но тогда, если я это check="$(cat "$HOME/log.txt" amp;>/dev/null | grep 'some_string')" сделаю, результирующая $check переменная всегда становится пустой, и, следовательно, она всегда говорит, что строка не найдена, даже если она на самом деле есть

Как я могу подавить вывод команды cat и сохранить ее значение переменной ?

Комментарии:

1. Заменить на amp;>/dev/null на 2>/dev/null ?

2. Похоже , это хорошо работает, спасибо . если вы можете представить это как ответ, я определенно приму его . Короткое и простое различие между amp;>/dev/null amp;amp; 2>/dev/null сделало бы его идеальным

3. grep 'some_string' "$HOME/log.txt" 2>/dev/null следует сделать то же самое без кошки и трубы

Ответ №1:

Заменить amp;>/dev/null на 2>/dev/null :

 check="$(cat "$HOME/log.txt" 2>/dev/null | grep 'some_string')"
 

Вот краткое описание того, как работают перенаправления:

  • 2>/dev/null перенаправит только стандартную ошибку;
  • 1>/dev/null или >/dev/null перенаправит только стандартный вывод.
  • amp;>/dev/null перенаправит как стандартный вывод, так и стандартную ошибку (не POSIX);

Комментарии:

1. рассмотрите также возможность включения >/dev/null в объяснение для полноты

2. добавление к ответу, 1>/dev/null как правило >/dev/null , перенаправляет только стандартный вывод. также обратите внимание, что amp;>/dev/null это не входит в стандарт POSIX и может не работать в некоторых оболочках.

3. @kevinnls Отредактировано