在bash脚本中永久保持文件打开

Use*_*er1 11 bash

我需要一种方法来使进程永远保持某个文件打开.这是我到目前为止的一个例子:

sleep 1000 > myfile &

它工作了一千秒,但实际上并不想做一些复杂的睡眠/循环声明.这篇文章暗示catsleep无限是一回事.所以我尝试了这个:

cat > myfile &

它几乎看起来像是一个错误不是吗?它似乎从命令行工作,但在脚本中文件连接没有保持打开状态.还有其他想法吗?

psm*_*ars 16

您也可以使用bash打开其中一个文件描述符,而不是使用后台进程:

exec 5>myfile
Run Code Online (Sandbox Code Playgroud)

(exec此处的特殊用途允许更改当前文件描述符重定向 - man bash有关详细信息,请参阅参考资料).这将打开文件描述符5到"myfile"(>>如果你不想清空文件,请使用).

您可以稍后再次关闭该文件:

exec 5>&-
Run Code Online (Sandbox Code Playgroud)

(一个可能的缺点是,FD会被同时运行的shell运行的每个程序继承.大多数情况下这是无害的 - 例如你的greps和seds通常会忽略额外的FD - 但在某些情况下它可能很烦人,尤其是如果你产生任何留下的进程(因为它们将保持FD打开).


DVK*_*DVK 8

之所以cat>myfile&有效,是因为它将标准输入重定向到文件中.

如果你用&符号(在后台)启动它,它将不会获得任何输入,包括文件结束,这意味着它将永远等待并且不输出任何输出文件.

您可以获得相同的效果,除非依赖于标准输入(后者是使其在您的脚本中不起作用的原因),使用以下命令:

tail -f /dev/null > myfile &
Run Code Online (Sandbox Code Playgroud)