希望现在我已经遇到了它,请注意这一点:
我已经知道可以使用test
( [
) 命令测试文件是否存在:
$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no
...但这需要在那里输入一些内容:)
所以,我在想是否有一个“默认”单个命令,它将返回文件存在结果到stdout
?
我还可以使用test
退出状态$?
:
$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1
...但这仍然是两个命令 - 并且逻辑也是“相反的”(0 表示成功,非零表示失败)。
我问的原因是我需要测试 中的文件是否存在gnuplot
,其“system("command")
以字符串形式从 stdout 返回结果字符流。"; 在gnuplot
我可以直接做:
gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes
所以我基本上希望能够写出这样的东西(伪):
gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
yes
...不幸的是,我不能直接通过test
and使用它$?
:
gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
no
...我必须颠倒逻辑。
所以,我基本上必须想出一种自定义脚本解决方案(或者编写一个内联脚本作为单行)......我想,如果已经有一个可以打印 0 或 1 的默认命令(或者自定义消息)到标准输出以了解文件存在,那么我不必这样做:)
(请注意,这ls
可能是一个候选者,但它的标准输出输出太冗长;如果我想避免这种情况,我必须抑制所有输出并再次返回存在状态,如
$ ls exists.file 1>/dev/null 2>/dev/null ; echo $?
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $?
2
...但这又是两个命令(以及更多的输入),以及“反向”逻辑...)
那么,是否有一个默认命令可以在 Linux 中执行此操作?
答案1
使用这个单一的 bash 命令:
[ -f /home/user/file_name ]
执行[]
测试并在成功时返回 0
答案2
听起来你需要反转退出状态,所以你可以这样做:
system("[ ! -e file ]; echo $?")
或者:
system("[ -e file ]; echo $((!$?))")
(注意这-f
是为了如果文件存在并且是一个常规文件。也可以看看这是我对相关 stackoverflow 问答的回答有关含义的更多题外话存在这里)。
答案3
怎么样“反转逻辑”:
file_exists = 1-system("test -f exists.file; echo $?")
答案4
这有效:
pwsh -c Test-Path /etc/passwd
...如果您安装了 PowerShell。如果路径存在,则返回字符串“True”;如果不存在,则返回“False”。 (这个答案我是否会得到“讽刺地无益”的分数?)