для чего используется скрипт 2>/dev/null в следующем скрипте?

Это URI для адреса электронной почты -, который браузер может использовать для вызова приложения электронной почты -для отправки электронной почты -на указанный адрес. Браузер должен предоставить параметр конфигурации для установки используемого приложения.

cron использует несвязанную переменную MAILTO (, т. е. MAILTO=...), в своей конфигурации, чтобы знать, куда отправлять электронную -почту с выводом команд, которые он запускает, вместо того, чтобы отправлять все это пользователю root.

0
20.04.2020, 13:55
2 ответа

В bash 1 означает stdout, 2 означает stderr (стандартный поток ошибок)

/dev/null — это виртуальное устройство, в которое вы можете записывать что угодно, и оно будет потреблять все (, по сути, избавляясь от вывода ).

Таким образом, 2> /dev/nullозначает, что перенаправить вывод ошибки этой команды в /dev/null. По сути это означает, что просто избавьтесь от сообщений об ошибках

2
19.03.2021, 02:27

Назначение 2>/dev/nullсостоит в том, чтобы скрыть ошибки, вызванные grep, путем перенаправления любых диагностических сообщений в/dev/null(специальный файл устройства, который отбрасывает записанные в него данные ).

Файл /etc/passwdвообще читается всеми пользователями, поэтому я не совсем понимаю, зачем нужно перенаправление потока ошибок. Однако, поскольку код использует grepв операторе if,вывод, который утилита может выдать (, строки, соответствующие $1), могут быть нежелательными, и с >/dev/nullэтот вывод будет отброшен. Поэтому я предполагаю, что 2в коде является опечаткой и автор намеревался написать

#!/bin/sh

if grep -e "$1" /etc/passwd >/dev/null; then
    echo "Pattern found - Job Over"
else 
    echo "Pattern not found"
fi

То есть к echoлюбой строке, отбрасывая фактически совпавшие строки. -eнеобходим, если строка в $1начинается с дефиса. Также обратите внимание на исправленную строку #!-.

Это также можно сделать без перенаправления:

#!/bin/sh

if grep -q -e "$1" /etc/passwd; then
    echo "Pattern found - Job Over"
else 
    echo "Pattern not found"
fi

-qзаставляет grepвыйти, как только совпадение найдено, а также делает его тихим (не выводит совпадающие строки ).


Если это grepдля имени пользователя в /etc/passwd, то с помощью

if getent passwd "$1" >/dev/null; then...; fi

был бы лучшим вариантом, так как использование простого grepможет найти имена пользователей, которые содержат строку в $1в качестве подстрок, если вы не позаботитесь о правильном создании выражения (регулярное выражение фактически не отображается в вопрос ). Команда getent passwdзавершалась бы с нулевым статусом выхода, отличным от -, если данное имя пользователя не было найдено в базе данных passwd.

Это также будет работать в системах, использующих базы данных NIS или LDAP для хранения информации о пользователях, но не будет работать в macOS (нет getentутилиты ).

1
19.03.2021, 02:27

Теги

Похожие вопросы