Почему удаление "2" в "2>" вызывает ошибку "Нет такого файла или каталога" - PullRequest
1 голос
/ 13 июля 2020
#!/bin/sh
if [ $# -lt 1 ]
then echo "error: provide an argument"
exit 1
fi

temp=$(mktemp 2> /dev/null)

wget -o /dev/null -O "$temp" "$1" || { echo "0"; exit 1;}
wc -c < "$temp" 
exit 0

Когда я удаляю 2 в «2>», я получаю сообщение об ошибке, но я хочу понять, почему это происходит. Зачем нужны эти 2?

1 Ответ

2 голосов
/ 13 июля 2020

2>file означает «перенаправить то, что написано в файловый дескриптор 2, в файл file». Дескриптор файла 2 - это «стандартная ошибка», дескриптор, в который программы записывают сообщения об ошибках. Поэтому 2>/dev/null заглушает сообщения об ошибках.

>file - это сокращение от 1>file. Это означает «перенаправить то, что написано в файловый дескриптор 1, в файл file». Файловый дескриптор 1 - это «стандартный вывод», дескриптор, в который программы записывают информационные сообщения. Таким образом, >/dev/null отключает информационные сообщения.

mktemp записывает сообщения об ошибках в stderr. 2>/dev/null заглушает сообщения об ошибках.

mktemp записывает сгенерированное имя файла в стандартный вывод. >/dev/null заглушает это. (Это делает звонок на mktemp бесполезным!)

Например,

$ alias hello='perl -e'\''print STDOUT "Hello\n"; print STDERR "World\n";'\'''

$ hello
Hello
World

$ hello 2>/dev/null
Hello

$ hello >/dev/null
World

Возможно, вы захотите заменить

temp=$( mktemp 2>/dev/null )

на

temp=$( mktemp ) || exit 1

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

...