Bash:重定向到文件,始终创建新的


8

在bash中,一个命令链接

echo test > actual.txt

actual.txt用“ test” 替换被调用文件的内容,并创建一个不存在的文件。但是,如果文件确实存在,bash只会打开它,截断它,然后将新内容写入文件。

具体来说,在这种情况下redirect命令失败:

ln -s /some/illegal/path link.txt
echo test > link.txt

Bash 4.4.12给了我令人困惑的错误消息link.txt: No such file or directory

避免这种情况的一种方法是确保在运行重定向命令之前删除文件。

rm link.txt && echo test > link.txt

不过,我想知道是否有一些bash选项或重定向操作符的调整可以防止这种故障模式。有任何想法吗?


如果link.txt链接指向您拥有写和搜索许可权但不存在的目录类型文件/dir/file所在的链接,该链接将不存在(并且重定向将在没有错误消息的情况下创建该文件)?如果存在但不是常规文件(设备,fifo,目录...),或者您没有对该文件的写入权限或搜索权限,该怎么办?/dir/dir/file/dir/file/dir
斯特凡Chazelas

Answers:


7

尝试写入无效的符号链接等同于尝试写入不存在的路径。没有办法“调整”输出重定向以在中创建路径(包括中间目录)bash,并且没有shell选项bash使之自动执行。

如果存在中间路径,但链接的终点不存在,则将通过重定向创建它。

你可能会做类似的事情

if [ -h file ] && [ ! -f file ]; then
    rm file
fi

测试“文件”是否为符号链接(-h),以及是否引用存在的常规文件(-f)。如果它是符号链接,但未引用文件,则将其删除。


1
我的问题的观点是,我不是要写任何东西。我想创建一个名为的新文件link.txt,并且在同一位置碰巧有一个符号链接。以问题的形式提出:如果我要在下一行覆盖文件,为什么还要麻烦测试呢?我可以做rm -f,它将具有相同的效果。
itsadok '18年

3
@itsadok啊。是。只是在rm -f filename使用重定向对其进行写入之前也可以解决您的问题。但这还取决于您是否希望它在当前目录中还是符号链接终点所在的目录中。
库萨兰达

您仍然可能缺少rm文件或写入文件的权限。在许多情况下,您无法为所有事情做好准备。您需要评估您真正期望的情况(即使在极少数情况下)并因此处理,您认为不太可能导致您故意不处理的情况,并接受一定数量的您考虑的情况,并且因此无法处理。
阿尔夫(Alfe)'18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.