未找到命令时的安全 shell 重定向

zhu*_*ujs 5 bash shell

假设text当前目录中有一个名为(不管它包含什么内容)的文本文件,当我运行命令时(在 Ubuntu 14.04,bash 版本 4.3.11 中):

nocommand > text # make sure noommand doesn't exists in your system
Run Code Online (Sandbox Code Playgroud)

它报告“找不到命令”错误并删除文本文件!我只是想知道如果命令不存在我是否可以避免文件的破坏。我尝试这个命令set -o noclobber,但如果我运行以下命令,也会出现同样的问题:

nocommand >| text # make sure noommand doesn't exists in your system
Run Code Online (Sandbox Code Playgroud)

bash 似乎在寻找要运行的特定命令之前重定向输出。谁能给我一些如何避免这种情况的建议?

Emi*_*ien 5

实际上,shell 首先查看重定向并创建文件。之后它会评估该命令。

因此,确切发生的情况是:因为它是重定向>,所以它首先用空文件替换该文件,然后评估不存在的命令,这会在 stderr 上生成错误消息,而在 stdout 上不会生成任何内容。然后它将 stdout 存储在此文件中(该文件什么也没有,因此文件保持为空)。

我同意 Nitesh 的观点,您只需要先检查命令是否存在,但根据此线程,您应该避免使用which. 我认为一个好的起点是在脚本的开头检查您是否可以运行所有必需的函数(请参阅线程,3 个解决方案),否则中止脚本。


anu*_*ava 1

如果你这样做:

set -o noclobber
Run Code Online (Sandbox Code Playgroud)

然后

invalidcmd > myfile
Run Code Online (Sandbox Code Playgroud)

如果myfile当前路径中存在,那么您将得到:

-bash: myfile: cannot overwrite existing file
Run Code Online (Sandbox Code Playgroud)