OS X Lion 中的 I/O 重定向

hca*_*ess 3 bash osx-lion

我有一个曾经可以工作的脚本,它依赖于使用 TCP 向侦听端口的进程发送命令(实际上要处理的文件名)。所以我可以启动它并告诉它监听,比如端口 9999。

作为一个快速的技巧,我将使用如下命令设置流重定向到端口 9999:

exec 3<> /dev/tcp/127.0.0.1/9999
Run Code Online (Sandbox Code Playgroud)

然后我可以在我想批处理我所有文件的目录中运行一个 find 命令,比如

find . -name "*.xml" -exec printf "$PWD/{} $PWD/{}\r\n" >&3 \;
Run Code Online (Sandbox Code Playgroud)

自从我升级到 Lion 后,我还没有尝试过这个,但它现在不起作用,给我一个“错误的文件描述符”响应。有人有任何想法吗?

小智 8

重定向到 /dev/tcp 和 /dev/udp 伪文件是 Bash 的一个可选编译时功能,许多操作系统供应商选择关闭该功能。看来苹果已经加入了这个俱乐部。您有几个选择:

  1. 像这样使用 Bash 的进程替换功能: exec 3> >(nc localhost 9999)

    如果您以交互方式执行此操作,一旦您不想再重定向到 TCP 套接字,您可能会想要执行此操作: exec 3> /dev/null

    这应该会导致产生的nc进程退出。

  2. 在 /dev/tcp 和 /dev/udp 伪文件支持打开的情况下编译您自己的 bash 并使用它。

  3. 修改您的脚本以将输出直接传送到nc命令。如果您的脚本多次将输出重定向到文件句柄 3 并且侦听过程没有正确处理多次连接尝试,这可能是一个问题。但是,如果您发现自己需要在不提供 Bash shell 的系统上使用脚本,它也更易于移植。