#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 Отредактировано