我从空目录开始。
$ touch aFile
$ ls
aFile
然后我ls
有两个参数,其中一个不在此目录中。我将两个输出流重定向到一个名为output
. 我使用>>
是为了避免同时写。
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
这似乎有效。这种方法有什么危险吗?
我从空目录开始。
$ touch aFile
$ ls
aFile
然后我ls
有两个参数,其中一个不在此目录中。我将两个输出流重定向到一个名为output
. 我使用>>
是为了避免同时写。
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
这似乎有效。这种方法有什么危险吗?
当你这样做时会发生什么
是那
file
将被打开以追加两次。这在 POSIX 文件系统上是安全的。在打开文件进行追加时发生的任何写入都将发生在文件的末尾,无论数据是来自标准输出流还是标准错误流。这依赖于对底层文件系统中原子追加写入操作的支持。某些文件系统,例如 NFS,不支持原子追加。参见 StackOverflow 上的问题“文件附加在 UNIX 中是原子的吗?”。
使用
即使在 NFS 上也可以工作。
但是,使用
不安全,因为 shell 会截断输出文件(两次),并且任何一个流上发生的任何写入都将覆盖另一个流已经写入的数据。
例子:
首先
hello
写入字符串(带有终止换行符),然后abc
从标准错误写入后跟换行符的字符串,覆盖hell
. 结果是abc
带有换行符的字符串,然后是第一个echo
输出的剩余部分,ano
和换行符。在输出文件中交换两个
echo
缠绕hello
的结果,因为该字符串最后写入并且比abc
字符串长。重定向发生的顺序无关紧要。使用更惯用的会更好,更安全
不,它不只是像标准一样安全
>>bar 2>&1
。当你写作
您使用
bar
两次打开文件O_APPEND
,创建两个完全独立的文件对象[1],每个对象都有自己的状态(指针、打开模式等)。2>&1
这与仅调用系统调用非常不同dup(2)
,并使同一文件对象的 stderr 和 stdout 可互换别名。现在,有一个问题:
您通常可以指望文件同时从两个不同的地方写入的概率很低
bar
。foo >>bar 2>&1
但是被你的>>bar 2>>bar
你只是增加了十几个数量级,没有任何理由。[1] POSIX 术语中的“打开文件描述”。
这取决于您想要达到的目标。由您决定是否可以在与输出相同的文件中出现错误。这只是将文本保存在具有外壳功能的文件中,可让您根据需要进行重定向。没有绝对的“是”或“否”。在 Linux 中,它可以通过多种方式完成,这是我
ls notExistingFile existingFile >> output 2>&1
回答问题的方式:就重定向本身而言,是的,它非常安全。