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

时间:2010-08-11 19:29:06

标签: bash

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

sleep 1000 > myfile &

它工作了一千秒,但实际上并不想做一些复杂的睡眠/循环语句。 This post建议catsleep无限相同。所以我尝试了这个:

cat > myfile &

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

4 个答案:

答案 0 :(得分:15)

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

exec 5>myfile

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

稍后您可以使用以下方法再次关闭该文件:

exec 5>&-

(其中一个可能的缺点是FD会在此期间由shell运行的每个程序继承。大多数情况下这是无害的 - 例如,您的grepsed通常会忽略额外的FD - 但在某些情况下它可能会很烦人,特别是如果你产生任何留在那里的进程(因为它们会保持FD打开)。

答案 1 :(得分:7)

cat>myfile&的工作原因是因为它将标准输入重定向到文件中。

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

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

tail -f /dev/null > myfile &

答案 2 :(得分:1)

在终端中运行的cat > myfile &问题与未作为脚本一部分运行的问题:在非交互式shell中,后台stdin的{​​{1}}被隐式重定向到{{1 }}。

因此,脚本中的command &实际上会被转换为/dev/null,会立即终止cat > myfile &

请参阅Shell命令语言&中的POSIX标准。 Asynchronous Lists

cat </dev/null > myfile

cat

答案 3 :(得分:0)

tail -f myfile

此'跟随'文件,并输出对文件的任何更改。如果您不希望看到tail的输出,请将输出重定向到/dev/null或其他内容:

tail -f myfile > /dev/null

您可能需要使用--retry选项,具体取决于您的具体情况。有关详细信息,请参阅man tail