Bash:重定向到文件,总是创建新的

its*_*dok 8 bash io-redirection symlink

在 bash 中,一个命令链接

echo test > actual.txt
Run Code Online (Sandbox Code Playgroud)

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

具体来说,重定向命令在这种情况下会失败:

ln -s /some/illegal/path link.txt
echo test > link.txt
Run Code Online (Sandbox Code Playgroud)

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

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

rm link.txt && echo test > link.txt
Run Code Online (Sandbox Code Playgroud)

不过,我想知道是否对 bash 选项或重定向运算符进行了一些调整,以防止这种失败模式。有任何想法吗?

Kus*_*nda 8

尝试写入死符号链接相当于尝试写入不存在的路径。无法“调整”输出重定向以在 中创建路径(包括中间目录)bash,并且没有 shell 选项bash可以自动执行此操作。

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

你可以做类似的事情

if [ -h file ] && [ ! -f file ]; then
    rm file
fi
Run Code Online (Sandbox Code Playgroud)

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

  • @itsadok 啊。是的。在使用重定向写入文件之前执行 `rm -f filename` 也可以解决您的问题。但这也取决于您是希望它位于当前目录中还是位于符号链接端点所在的目录中。 (3认同)