Linux-Linux中 & &> /dev/null与&> /dev/null &有什么区别呢?
安装mysql的最后一步是这样的
/plat/mysql/bin/mysqld_safe --user=mysql --basedir=/plat/mysql --datadir=/data/sgc8k_web/ &
/plat/mysql/bin/mysql
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这问题挺有意思的,不惜浪费我中午休息时间研究下。
我觉得应该是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 & 才是忽略输出的正确写法。