Bash 为什么要删除;2“;在;2>&引用;原因a“;没有这样的文件或目录;错误 #/垃圾箱/垃圾箱 如果[$#-lt 1] 然后回显“错误:提供参数” 出口1 fi 温度=$(mktemp 2>/dev/null) wget-o/dev/null-o“$temp”“$1”| |{echo“0”;退出1;} wc-c中的2时,我会得到一个错误,但我想了解为什么会发生这种情况。为什么这2是必需的?2>文件的意思是“将写入文件描述符2的内容重定向到文件文件”。文件描述符2是“标准错误”,即程序向其写入错误消息的描述符2>/dev/null因此会使错误消息静音

Bash 为什么要删除;2“;在;2>&引用;原因a“;没有这样的文件或目录;错误 #/垃圾箱/垃圾箱 如果[$#-lt 1] 然后回显“错误:提供参数” 出口1 fi 温度=$(mktemp 2>/dev/null) wget-o/dev/null-o“$temp”“$1”| |{echo“0”;退出1;} wc-c中的2时,我会得到一个错误,但我想了解为什么会发生这种情况。为什么这2是必需的?2>文件的意思是“将写入文件描述符2的内容重定向到文件文件”。文件描述符2是“标准错误”,即程序向其写入错误消息的描述符2>/dev/null因此会使错误消息静音,bash,sh,Bash,Sh,当我删除“2>中的2时,我会得到一个错误,但我想了解为什么会发生这种情况。为什么这2是必需的?2>文件的意思是“将写入文件描述符2的内容重定向到文件文件”。文件描述符2是“标准错误”,即程序向其写入错误消息的描述符2>/dev/null因此会使错误消息静音 >file是1>file的缩写。它的意思是“将写入文件描述符1的内容重定向到文件file”。文件描述符1是“标准输出”,即程序向其写入信息消息的描述符>/dev/null因此会使信息性消息静音 mktemp将错误消息写入stderr2>/de

当我删除“2>中的2时,我会得到一个错误,但我想了解为什么会发生这种情况。为什么这2是必需的?

2>文件
的意思是“将写入文件描述符
2
的内容重定向到文件
文件
”。文件描述符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'\''打印标准输出“hello\n”;打印标准“世界”;“\'''
美元你好
你好
世界
$hello 2>/dev/null
你好
$hello>/dev/null
世界

你可能想替换

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

temp=$(mktemp)|退出1

使用有用的消息失败,而不是将错误数据传递给
wget
(这将导致失败)。

2
表明文件描述符2是标准错误(stderr)。@bigbounty right,我得到了。但是,我不明白为什么在这种情况下有必要这样做。如果没有
2
temp=$(mktemp>/dev/null)
mktemp
命令的输出指向/dev/null,那么
$()
就不会留下任何要捕获的内容。因此,
temp
变量将设置为空字符串。显然,将空文件名传递给
wget-O
会混淆它,从而导致错误。实际上,我建议使用类似
temp=$(mktemp)|退出1
的方法,以防出现错误(可能是
mktemp
失败),它将退出,而不是在没有有效临时文件的情况下继续。@RaviSangani:
mktemp
如果没有任何选项,在您使用它时,确实不会抛出错误,但我们不能说它不会抛出错误。我曾经在一台机器上,每两天/tmp的文件系统就会溢出一次,这会导致
mktemp
失败。我当然不会抑制来自它的错误消息。这些错误可能很少见,但如果有,你会很高兴看到发生了什么。
#!/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