bash - 为什么删除“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 个?
解决方案
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
(这将导致失败)。
推荐阅读
- php - 如何删除数组编号
- html - 为什么 HTML 文档的标题写成 'title' 元素而不是 'meta' 元素?
- compiler-errors - 使用 nvcc 执行 OpenMPI 代码时出错(OPAL 错误)
- docker - 如何限制 Docker 容器对其他容器和互联网的访问(仅对主机公开端口)?
- c# - 调用带有参数作为字符串的函数
- java - 使用 Guice 框架编写基于注解的方法拦截器时无法注入 java 对象
- angular - 根据表单输入字段的变化调用对话窗口
- javascript - 确定父容器子元素是否包含特定类并执行某些操作的条件
- javascript - 希望函数B等到函数A在AngularJS中完成
- python - Flask + uwsgi + keras 错误“该死!工人1(pid:5240)死亡,被信号11杀死:(尝试重生……)”