繁体   English   中英

bash重定向到/ dev / stdout:不是目录

[英]bash redirect to /dev/stdout: Not a directory

我最近从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 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的重定向stdout。 我猜这不是太令人惊讶,但仍然为什么它在一台机器上运行,但在运行相同的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 mount,但可能有一个机器版本或配置略有不同导致错误。 总之,除非您知道父进程不会重定向,否则应避免重定向到/ dev / stdout。

更新:从v3升级到NFS v4后出现此问题。 在降级回v3后,这种行为消失了。

早上好,user1999165,:)

我怀疑它与底层文件系统有关。 在同一台机器上,尝试:

(echo“hi”> / dev / stdout)> / tmp /test.txt

/ tmp /应该是linux native(ext3或者其他)文件系统

在许多Linux系统上, /dev/stdout是当前进程的文件描述符1的别名(链接或类似)。 当您从C查看它时,全局stdout连接到文件描述符1。

这意味着echo foo > /dev/stdoutecho foo 1>&1或者文件描述符重定向到自身。 我不希望这个工作,因为语义是“重定向然后克隆新目标的关闭描述符”。 因此,为了使其工作,必须有特殊的代码,注意到两个文件描述符实际上是相同的,并且跳过“关闭”步骤。

我的猜测是,在它失败的系统上,BASH无法找出/dev/stdout == fd1并实际关闭它。 但错误信息很奇怪。 OTOH,我不知道任何其他更适合的常见错误。

注意:我尝试使用BASH 4.3.11在Kubuntu 14.04上复制您的问题,在这里,重定向工作(即我没有收到错误)。 也许这是BASH 4.1中的一个错误,它已修复,因为。

我看到将问题写入管道标准输入到AWS EFS(NFSV4)的问题与此问题并行。 (使用Centos 6.8,遗憾的是无法将bash升级到4.2)。

我向AWS提供了支持,这是他们的回应 -

这个问题与EFS本身无关,这里的问题是bash。 此问题已在RHEL中的bash 4.2或更高版本中修复。

要避免此问题,请尝试在子shell中运行echo命令之前创建文件句柄,之后可以将相同的文件处理程序用作重定向。 如下例所示:

exec 5> test.txt; (echo "hi" >&5); cat test.txt
hi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM