Linux-Linux中 & &> /dev/null与&> /dev/null &有什么区别呢?

发布于 2016-10-17 01:33:15 字数 156 浏览 1330 评论 1

安装mysql的最后一步是这样的

/plat/mysql/bin/mysqld_safe --user=mysql --basedir=/plat/mysql --datadir=/data/sgc8k_web/ &
/plat/mysql/bin/mysql

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜柠檬 2017-01-20 23:09:22

这问题挺有意思的,不惜浪费我中午休息时间研究下。

我觉得应该是shell操作符优先级导致,不妨先写个脚本模拟下:

 #!/bin/bash

for (( i=1;i<10;i++ )) ; do
echo "hello!"
sleep 2
done

分别执行 ./a.sh & 和 ./a.sh & &>/dev/null 和 ./a.sh &> /dev/null &
结果确实如题主所述。

但执行下面这两个命令的结果就能说明问题了:

[zh@asus-laptop ~]$ (./a.sh &) &>/dev/null
[zh@asus-laptop ~]$ ps -ef | grep .a.sh
zh 27299 1 0 13:11 pts/1 00:00:00 /bin/bash ./a.sh
zh 27304 25726 0 13:11 pts/1 00:00:00 grep .a.sh
这个命令没有输出,而我们看到./a.sh确实是在执行的。

而:
[zh@asus-laptop ~]$ ./a.sh & (&>/dev/null)
27370
[zh@asus-laptop ~]$ hello!
hello!
hello!
hello!
hello!
hello!
hello!
hello!
hello!

+ 完成 ./a.sh
[zh@asus-laptop ~]$
可以看出这个命令的输出结果与 ./a.sh & &>/dev/null 是一致的。

那 ./a.sh & &>/dev/null 的意思就是 先后台执行a.sh(即./a.sh &),然后再执行&>/dev/null,可能就是由于a.sh已经在后台执行了,重定向已经没有意义了。(这个解释比较牵强,高手们再讨论下)
为了证明这个想法,执行下重定向到文件看是否有写入文件:
[zh@asus-laptop ~]$ ./a.sh & &> a.log
27456
[zh@asus-laptop ~]$ hello!
hello!
hello!
hello!
hello!
hello!
hello!
hello!
hello!

+ 完成 ./a.sh
[zh@asus-laptop ~]$ cat a.log
[zh@asus-laptop ~]$
果然a.log是空的。这就验证了重定向是没有用的。

&> 是重定向stdout和stderr用的,所以 ./a.sh &>/dev/null & 才是忽略输出的正确写法。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文