首页 > 解决方案 > 为什么删除“2>”中的“2”会导致“没有这样的文件或目录”错误

问题描述

#!/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 个?

标签: bashsh

解决方案


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

>file是 的缩写1>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(这将导致失败)。


推荐阅读