我最近从CentOS 5.8(带有GNU bash 3.2.25)升级到CentOS 6.5(带有GNU bash 4.1.2)。一个在CentOS 5.8下工作的命令,在CentOS 6.5下不再工作。这只是一个简单愚蠢的例子,但我正在尝试理解在bash中发生了什么导致了不同的行为。也许这是bash 4.1.2中的新bug,或者是旧bug在修复后产生的新行为?
更新:看起来这个问题与 CentOS 版本无关。我有另一台 CentOS 6.5 的机器,该命令可以正常工作。我已经排除了任何环境变量的因素。你有什么想法吗? 在所有的机器上,这些命令都给出相同的输出结果:
另一个更新:看起来子shell正在继承父shell的重定向标准输出。我想这并不令人惊讶,但为什么它在一台机器上可以工作,在另一台机器上失败,当它们运行相同的bash版本时呢?
在正常工作的机器上:
我认为Yu Huang是正确的,重定向到/tmp对两台机器都有效。这两台机器都使用isilon NAS来挂载/home,但可能有些微不同的文件系统版本或配置导致了错误。总之,除非您知道父进程不会将其重定向,否则应避免重定向到/dev/stdout。
更新:此问题出现在从v3升级到NFS v4后。退回到v3后,此行为消失了。
CentOS 5.8:
(echo "hi" > /dev/stdout) > test.txt
echo $?
0
cat test.txt
hi
CentOS 6.5:
(echo "hi" > /dev/stdout) > test.txt
-bash: /dev/stdout: Not a directory
echo $?
1
更新:看起来这个问题与 CentOS 版本无关。我有另一台 CentOS 6.5 的机器,该命令可以正常工作。我已经排除了任何环境变量的因素。你有什么想法吗? 在所有的机器上,这些命令都给出相同的输出结果:
ls -ld /dev/stdout
lrwxrwxrwx 1 root root 15 Apr 30 13:30 /dev/stdout -> /proc/self/fd/1
ls -lL /dev/stdout
crw--w---- 1 user1 tty 136, 0 Oct 28 23:21 /dev/stdout
另一个更新:看起来子shell正在继承父shell的重定向标准输出。我想这并不令人惊讶,但为什么它在一台机器上可以工作,在另一台机器上失败,当它们运行相同的bash版本时呢?
在正常工作的机器上:
((ls -la /dev/stdout; ls -la /proc/self/fd/1) >/dev/stdout) > test.txt
cat test.txt
lrwxrwxrwx 1 root root 15 Aug 13 08:14 /dev/stdout -> /proc/self/fd/1
l-wx------ 1 user1 aladdin 64 Oct 29 06:54 /proc/self/fd/1 -> /home/user1/test.txt
我认为Yu Huang是正确的,重定向到/tmp对两台机器都有效。这两台机器都使用isilon NAS来挂载/home,但可能有些微不同的文件系统版本或配置导致了错误。总之,除非您知道父进程不会将其重定向,否则应避免重定向到/dev/stdout。
更新:此问题出现在从v3升级到NFS v4后。退回到v3后,此行为消失了。
echo "hi" > test.txt
? - anubhavals -ld /dev/stdout
的输出。 - Cyrus/dev/stdout
不是一个目录,这是正确的,但似乎不相关。无论如何,(echo "hi" > /dev/stdout) > test.txt
应该做什么呢?同时输出到/dev/stdout
和test.txt
吗?我认为这就是tee
的作用。 - ooga/dev/stdout
,它会显示“没有这个文件或目录”(或者如果/dev/stdout
神秘地成为了一个目录,则会显示“是一个目录”);“不是目录”意味着路径上的某个元素不是目录,而对于可能出现此问题的路径上的唯一元素是/
和/dev
- 尽管我不认为我相信它。(echo "hi" > /dev/stdout)
将子shell的echo
输出重定向到标准输出,这就是它本来要去的地方;> test.txt
将文件test.txt
的标准输出发送出去。这一切都有点奇怪。 - Jonathan Leffler