How can I suppress error messages for a shell command?
For example, if there are only jpg
files in a directory, running ls *.zip
gives an error message:
$ ls *.zip
ls: cannot access '*.zip': No such file or directory
Is there an option to suppress such error messages? I want to use this command in a Bash script, but I want to hide all errors.
asked Sep 3, 2015 at 15:31
6
Most Unix commands, including ls
, will write regular output to standard output and error messages to standard error, so you can use Bash redirection to throw away the error messages while leaving the regular output in place:
ls *.zip 2> /dev/null
answered Sep 3, 2015 at 15:33
AJefferissAJefferiss
1,5931 gold badge12 silver badges17 bronze badges
1
$ ls *.zip 2>/dev/null
will redirect any error messages on stderr to /dev/null (i.e. you won’t see them)
Note the return value (given by $?
) will still reflect that an error occurred.
answered Sep 3, 2015 at 15:34
Brian AgnewBrian Agnew
267k36 gold badges333 silver badges440 bronze badges
To suppress error messages and also return the exit status zero, append || true
. For example:
$ ls *.zip && echo hello
ls: cannot access *.zip: No such file or directory
$ ls *.zip 2>/dev/null && echo hello
$ ls *.zip 2>/dev/null || true && echo hello
hello
$ touch x.zip
$ ls *.zip 2>/dev/null || true && echo hello
x.zip
hello
answered Nov 11, 2017 at 6:45
A-CA-C
1211 silver badge4 bronze badges
2
I attempted ls -R [existing file] and got an immediate error.
ls: cannot access ‘existing file’: No such file or directory
So, I used the following:
ls -R 2>dev/null | grep -i [existing file]*
ls -R 2>dev/null | grep -i text*
Or, in your case:
ls -R 2>dev/null | grep -i *.zip
answered Jan 4, 2022 at 19:36
1
My solution with a raspberry pi3 with buster.
ls -R 2>/dev/null | grep -i [existing file]*
2>/dev/null is very usefull with Bash script to avoid useless warnings or errors.
Do not forget slash caracter
answered Feb 6 at 13:32
1
I’m trying to show the number of lines, words and characters of all configuration files in /etc/*conf
(with command wc
).
How can I modify the command (or commandline) to not view the error messages?
quack quixote
41.9k14 gold badges105 silver badges130 bronze badges
asked Mar 25, 2010 at 22:26
1
wc /etc/*conf 2>/dev/null
answered Mar 25, 2010 at 23:33
Dennis WilliamsonDennis Williamson
105k19 gold badges164 silver badges187 bronze badges
i don’t have access to a shell right now, but you can try something like
cat /etc/*.conf 2> /dev/null | wc -l
That should redirect all the errors and leave the output to be passed to wc
answered Mar 25, 2010 at 22:39
Roy RicoRoy Rico
5,8187 gold badges43 silver badges57 bronze badges
1
Usually just redirect the standard output to /dev/null to ignore the output, but this is not good practice when writing shell scripts
Try use -q instead to run the shell in quite mode, which will produce less output.
This might not be relevant to the question, but just FYI.
answered May 1, 2013 at 7:10
imcoddyimcoddy
2711 gold badge2 silver badges5 bronze badges
8.4.2. Подавление вывода сообщений об ошибках
Допустим, вы хотите найти запись пользователя louise в системном файле паролей:
$ grep louise /etc/passwd
louise:lxAL6GW9G.ZyY:501:501:Accounts Sect1С:/home/accts/louise:/bin/sh
He исключена возможность, что вы забудете, как называется этот файл. В таком случае воспользуйтесь следующей командой:
$ grep louise /etc/password
grep: /etc/password: No such file or directory
Команда grep выводит сообщение об ошибке, в которой говорится о том, что указанного файла не существует. Можно попробовать провести поиск во всех файлах каталога /etc:
$ grep louise /etc/*
Однако в результате будут выведены многочисленные сообщения об ошибках, гласящие, что к определенным файлам доступ запрещен, а некоторые элементы каталога являются подкаталогами и поиск в них не ведется.
В подобной ситуации можно воспользоваться опцией -s, которая подавляет вывод сообщений об ошибках:
$ grep -a louise /etc/*
Если ваша версия команды grep не поддерживает данную опцию, воспользуйтесь следующей командой:
$ grep louise /etc/* 2> /dev/null
Эта команда направляет поток ошибок (2>) в системную корзину (устройство /dev/null). На жаргоне системных администраторов это устройство называется битодробилкой.
Читайте также
Уровни вывода сообщений ядра
Уровни вывода сообщений ядра
Главное отличие между функциями printk() и printf() — это возможность в первой указывать уровень вывода сообщений ядра (loglevel). Ядро использует уровень вывода сообщений для принятия решения о том, выводить сообщение на консоль или нет. Ядро выводит на
Отправка сообщений об ошибках
Отправка сообщений об ошибках
Если вы обнаружили ошибку, то наилучшим решением будет исправить ее, сгенерировать соответствующую заплату, оттестировать и отправить, как это будет рассказано в следующих разделах. Конечно, можно и просто сообщить об ошибке, чтобы
7.2 Сообщения об ошибках ICMP
7.2 Сообщения об ошибках ICMP
Бывают ситуации, приводящие к отбрасыванию (удалению из сети) датаграммы IP. Например, точка назначения может стать недоступной из-за обрыва связи. Или может завершиться время жизни датаграммы. Маршрутизатор не сможет переслать длинную
7.2.1 Типы сообщений об ошибках
7.2.1 Типы сообщений об ошибках
На рис. 7.3 показаны обобщенные сообщения, формируемые маршрутизатором и хостом назначения для отчета о возникшей проблеме. В таблице 7.1 перечислены формальные имена сообщений об ошибках ICMP.
Рис. 7.3. Типы сообщений об ошибках ICMPТаблица 7.1
Подавление линий заднего плана
Подавление линий заднего плана
Команда HIDE обеспечивает создание рисунка без скрытых линий. Сложные трехмерные модели часто оказываются перегруженными, что затрудняет их чтение и просмотр результатов выполнения какой-либо команды на объекте. Можно устранить эту
В.З. Стандартные функции вывода сообщений об ошибках
В.З. Стандартные функции вывода сообщений об ошибках
Мы определили свой набор функций, используемых во всех программах книги для обработки ситуаций с возникновением ошибок. Причина, по которой мы создаем эти функции, заключается в том, что теперь мы можем писать команды в
Отчет об ошибках
Отчет об ошибках
На вкладке Дополнительно в окне Свойства системы нажимаем кнопку Отчет об ошибках. Откроется одноименное окно Отчет об ошибках (рис. 4.5), в котором устанавливаем переключатель в положение Отключить отчет об ошибках и оставляем установленным флажок Но
Получение и пересылка сообщений. Создание ответных сообщений
Получение и пересылка сообщений. Создание ответных сообщений
Чтобы получить новую почту, выполните команду главного меню Сервис ? Отправить/Получить ? Доставить почту либо нажмите клавишу F9. Все полученные почтовые сообщения будут помещены в папку Входящие и помечены
Шаг 20 — Временные объекты. Неявные вызовы конструкторов и их подавление.
Шаг 20 — Временные объекты. Неявные вызовы конструкторов и их подавление.
Не удается углубиться в какую-либо тему. Приходится касаться по верхам, потом переключаться на что-то другое. С другой стороны, может это и правильно, часто достаточно только знать, что есть ТАКОЕ
Настройка вывода сообщений об ошибках с помощью ‹customErrors›
Настройка вывода сообщений об ошибках с помощью ‹customErrors›
Элемент ‹customErrors› может использоваться для автоматического перенаправления всех ошибок в пользовательский набор файлов *.htm. Это может оказаться полезным тогда, когда вы хотите построить более понятную для
Подавление линий заднего плана
Подавление линий заднего плана
Команда HIDE обеспечивает создание рисунка без скрытых линий. Сложные трехмерные модели часто оказываются перегруженными, что затрудняет их чтение и просмотр результатов выполнения какой-либо команды на объекте. Можно устранить эту
Сообщение об ошибках gbak
Сообщение об ошибках gbak
В табл. 38.3 описаны сообщения об ошибках, которые могут возникнуть в процессе копирования и восстановления, вместе с некоторыми советами, как поступать с этими ошибками.Таблица 38.3. Сообщения об ошибках gbak при копировании и восстановлении
Сообщение
Подавление линий заднего плана
Подавление линий заднего плана
Команда HIDE обеспечивает создание рисунка без скрытых линий . Сложные трехмерные модели часто оказываются перегруженными, что затрудняет их чтение и просмотр результатов выполнения какой-либо команды на объекте. Можно устранить эту
Подавление линий заднего плана
Подавление линий заднего плана
Команда HIDE обеспечивает создание рисунка без скрытых линий. Сложные трехмерные модели часто оказываются перегруженными, что затрудняет их чтение и просмотр результатов выполнения какой-либо команды на объекте. Можно устранить эту
Отчеты об ошибках
Отчеты об ошибках
В операционной системе Windows Vista реализован новый механизм отчетов об ошибках. Теперь ограничить и настроить его работу можно с помощью следующих параметров, расположенных в ветви реестра HKEY_CURRENT_USERSoftwarePoliciesMicrosoftWindowsWindows Error Reporting. Если не сказано иное,
You’re right; pkill isn’t generating the message, bash is.
You suggest that
$ ./test1.sh 2> /dev/null
is a possible solution.
As UVV points out, the equivalent action from within the script is
exec 2> /dev/null
This redirects the stderr for the script to /dev/null
from this statement until it is changed back.
Clumsy ways of changing it back include
exec 2> /dev/tty
which redirects stderr to the terminal.
This is probably (but not necessarily) where it was originally.
Or
exec 2>&1
which sets stderr to be the same as stdout, and is likely to be wrong.
A more reliable way is
exec 3>&2 exec 2> /dev/null (do stuff where you don't want to see the stderr.) exec 2>&3
which saves the original stderr in file descriptor 3, and later restores it.
Other ways to suppress just the announcement of the process death include
(sleep 10 & pkill sleep) 2> /dev/null
and
{ sleep 10 & pkill sleep;} 2> /dev/null
which change the stderr for only the grouped commands.
You can put 2>/dev/null
behind a command to suppress errors:
ls /home/cas/thisfolderdoesntexist
-> error
ls /home/cas/thisfolderdoesntexist 2>/dev/null
-> no output because error is suppressed.
You can also put 2>/dev/null
behind a script to run the complete script with errors suppressed:
./script.sh 2>/dev/null
What your doing is redirecting (>
) errors (2
) to /dev/null
. Every piece of data (in this case the output of your command(s)/script) that is redirected to /dev/null will be completely ignored. See it as a trash can for data.
Edit:
2>/dev/null
suppresses the output of the command, not the complete pipe. In the example that you gave, you’re supressing errors from the awk command. If the error is comming from the ls
command, do the following (this will suppress errors from the ls command):
ls /bootpool 2>/dev/null | grep boot | awk 'NR==1{print $1}'
If the error is comming from the grep command:
ls /bootpool | grep boot 2>/dev/null | awk 'NR==1{print $1}'
I think you get it now.
A good thing to remember:
1
= stdout = normal output of a command
2
= stderr = error output of a command
0
= stdin = input to a command (this isn’t usefull for redirecting, more for logging)
I also improved your script (using shellcheck, you can install it or use their online tool link):
#!/bin/sh
boot=$(find /bootpool/*boot* 2>/dev/null | sed "s|/.*/||")
data=$(find /datapool/*boot* 2>/dev/null | sed "s|/.*/||")
echo "boot"
if [ "$boot" = "boot" ]
then
echo "boot"
pass=$(grep rootpw /bootpool/boot/loader.conf | grep -o '".*"' | sed 's|"||g' | awk 'BEGIN { ORS = " " } { print }')
elif [ "$data" = "boot" ]
then
pass=$(grep rootpw /datapool/boot/loader.conf | grep -o '".*"' | sed 's|"||g' | awk 'BEGIN { ORS = " " } { print }')
else
echo "Couldn't find boot in bootpool nor datapool"
exit
fi
if [ "$pass" = edjos ]
then
echo "You are at default password. kindly change the password"
oldpass=$(grep root /etc/master.passwd | awk 'NR==1 { print $1 }' | cut -d ':' -f 2 | sed 's/$/%/g')
passwd
newpass=$(grep root /etc/master.passwd | awk 'NR==1 { print $1 }' | cut -d ':' -f 2 | sed 's/$/%/g')
if [ "$newpass" != "$oldpass" ]
then
if [ "$boot" = "boot" ]
then
sed -i.bak '/mfsbsd.rootpw/s/edjos//' /bootpool/boot/loader.conf
sed -i.bak '/mfsbsd.rootpwhash/d' /bootpool/boot/loader.conf
echo "mfsbsd.rootpwhash="$newpass"" >> /bootpool/boot/loader.conf
echo "Great! password updated successfully"
elif [ "$data" = "boot" ]
then
sed -i.bak '/mfsbsd.rootpw/s/edjos//' /datapool/boot/loader.conf
sed -i.bak '/mfsbsd.rootpwhash/d' /datapool/boot/loader.conf
echo "mfsbsd.rootpwhash="$newpass"" >> /datapool/boot/loader.conf
echo "Great! password updated successfully"
fi
fi
else
echo "Great! you are having authorised password"
fi
- You were using
==
but /bin/sh doesn’t make use of that. Only=
. When you use /bin/bash,==
will actually become usefull. But as you don’t, you need to use=
. - I changed the way you set the boot and data variables. The way you did it was inefficient.
- When both $boot and $data are empty, the script will catch it instead of letting you continue. This is handy because in your second if statement, when $oldpass and $newpass aren’t equal, it depends on either $boot or $data to contain «boot». But what if they don’t? That’s what the
else
is for in the first if-statement. - Putting
""
around variables.echo $var
->echo "$var"