在我正在处理的 bash 脚本(必须在 Ubuntu 和 OS X 上运行)中,我需要将数百个命令的输出重定向到一个文件。
而不是附加&>...
到所有这些,我只是做
exec 9>&1
exec 5<>/tmp/some-file.txt
exec 1>&5
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但在所有这些命令执行到一半时,我需要读取到目前为止已写入的所有内容,同时保持文件描述符处于打开状态。
现在,在 Ubuntu 上我可以简单地做
cat /dev/fd/5
Run Code Online (Sandbox Code Playgroud)
或者
tee </dev/fd/5
Run Code Online (Sandbox Code Playgroud)
但在 OS X 上,根本不打印任何内容(并且命令立即退出)。
但是,使用less
我可以在两者上看到文件的内容。
我可以通过使用实现上述效果(在两个操作系统上都工作)
less /dev/fd/5 | tee
Run Code Online (Sandbox Code Playgroud)
但这似乎是一个黑客。
那么,为什么less
显然可以看到cat
OS X上看不到的东西呢?(或者所有 BSD 后代都受到影响?)
还是我做错了什么?
在 Linux 上,一个进程是否可以在另一个打开的套接字中写入?
假设我使用 netcat 打开与 google.com 的连接:
myuser@linux:~$ nc google.com 80
Run Code Online (Sandbox Code Playgroud)
现在我可以查找进程 pid 并打开其文件描述符文件夹:
myuser@linux:~$ ls -la /proc/24105/fd
totale 0
dr-x------ 2 myuser myuser 0 2012-03-10 19:01 .
dr-xr-xr-x 7 myuser myuser 0 2012-03-10 19:01 ..
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 0 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 1 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:01 2 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 3 -> socket:[3947162]
Run Code Online (Sandbox Code Playgroud)
所以现在我想使用该套接字内的回声发出 HTTP 请求: …