我有一个以前能用的脚本,它依赖于使用 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 也加入了这个俱乐部。您有以下几种选择:
像这样使用 Bash 的进程替换功能:
exec 3> >(nc localhost 9999)
如果您以交互方式执行此操作,则当您不再想重定向到 TCP 套接字时,您可能需要执行以下操作:
exec 3> /dev/null
这应该会导致
nc
产生的进程退出。编译您自己的 bash,并启用 /dev/tcp 和 /dev/udp 伪文件支持并使用它。
修改脚本以将输出直接传送到
nc
命令。如果您的脚本多次将输出重定向到文件句柄 3,并且监听过程无法正确处理多次连接尝试,则这可能是一个问题。但是,如果您发现自己需要在不提供 Bash shell 的系统上使用脚本,它也更具可移植性。