OS X Lion 中的 I/O 重定向

OS X Lion 中的 I/O 重定向

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

作为一个快速破解,我将使用以下命令设置流重定向到端口 9999:

exec 3<> /dev/tcp/127.0.0.1/9999

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

find . -name "*.xml" -exec printf "$PWD/{} $PWD/{}\r\n" >&3 \;

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

答案1

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

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

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

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

  2. 编译您自己的 bash,并启用 /dev/tcp 和 /dev/udp 伪文件支持并使用它。

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

相关内容