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因此会使错误消息静音
当我删除“2>中的2时,我会得到一个错误,但我想了解为什么会发生这种情况。为什么这2是必需的?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>/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