为什么删除“2>”中的“2”会导致 "No such file or directory" 错误

Why does removing the "2" in "2>" cause a "No such file or directory" error

#!/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" "" || { echo "0"; exit 1;}
wc -c < "$temp" 
exit 0

当我删除“2>”中的 2 时出现错误,但我想了解为什么会出现这种情况。为什么需要 2?

2>file 表示“将写入文件描述符 2 的内容重定向到文件 file”。文件描述符 2 是“标准错误”,程序向其写入错误消息的描述符。 2>/dev/null 因此使错误消息静音。

>file1>file 的缩写。它的意思是“将写入文件描述符 1 的内容重定向到文件 file”。文件描述符 1 是“标准输出”,程序向其写入信息消息的描述符。 >/dev/null 因此使信息性消息静音。

mktemp 将错误消息写入标准错误。 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(这将导致它失败)。