OS X Lion中的I / Oredirect

我有一个曾经工作的脚本,它依赖于使用TCP发送命令(事实上要处理的文件名)到侦听端口的进程。 所以我可以开火,告诉它听,说港口9999。

作为一个快速入侵,我将使用如下命令将streamredirect到端口9999:

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

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

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

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

redirect到/ dev / tcp和/ dev / udp伪文件是Bash的一个可选编译时间function,许多OS供应商都select离开。 看来苹果已经join了俱乐部。 你有几个select:

  1. 使用Bash的进程replacefunction,如下所示: exec 3> >(nc localhost 9999)

    如果你是以交互方式进行交互的话,那么当你不想再redirect到TCP套接字时,你可能会想这样做: exec 3> /dev/null

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

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

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