iti*_*nok 7 testing command-line bash
在 Bash 上,我们如何测试名称字符串是否是可执行文件,因为尝试过它不起作用:
$ [[ -x cp ]] &&echo YES
$
$ [[ -x ls ]] &&echo YES
Run Code Online (Sandbox Code Playgroud)
努力尝试不会是正确的方法:
$ >/dev/null type ls && echo YES
YES
$ >/dev/null type -fat && echo YES
YES
Run Code Online (Sandbox Code Playgroud)
这是一次非常失败的失败,感谢之前的帮助
van*_*ium 10
问题不太清楚:
该-x测试在第二种情况下很有用,因为它测试给定文件是否可执行,即是否设置了可执行位。
它要求您提供有效的文件名。除非您提供完整的文件路径,否则将搜索当前目录。因此,您的命令通常会因eg而失败cp,除非您首先将可执行文件的目录设置为当前目录,即cd /usr/bin。
要检索可执行文件的完整文件路径,您可以使用 shell 内置type选项-P,以便仅检索搜索中匹配的可执行文件PATH(忽略别名、散列命令和函数)。请注意,这可能不是系统默认执行的操作。
您还可以添加测试失败时要执行的操作。那么你的语句就变成:
[[ -x $(type -P cp) ]] && echo YES || echo NO
Run Code Online (Sandbox Code Playgroud)
也可以写成
test -x $(type -P cp) && echo YES || echo NO
Run Code Online (Sandbox Code Playgroud)
如果您的问题旨在询问如何测试某些命令在您的系统上是否是可执行命令,只需使用type:
type ls &>/dev/null && echo YES || echo NO
Run Code Online (Sandbox Code Playgroud)
如果字符串与可执行文件不对应,Type 将返回错误代码,因此第二个命令将不会被执行。
您可以使用command -v命令来测试这一点:
command -v cp >/dev/null 2>&1 && echo "YES"
Run Code Online (Sandbox Code Playgroud)
将返回:
YES
Run Code Online (Sandbox Code Playgroud)
尽管:
command -v fhdjskfsfs >/dev/null 2>&1 && echo "YES"
Run Code Online (Sandbox Code Playgroud)
很可能不会返回任何内容(除非您在名为 的路径中有一个可执行文件fhdjskfsfs)。
在 Bash 上,我们如何测试名称字符串是否可执行?
如果您像这样使用它,那么您使用typeshell 内置命令的逻辑应该可以工作(不包括您似乎想要的 shell 内置命令和函数):
&>/dev/null type -afPt -- ls && echo yes
Run Code Online (Sandbox Code Playgroud)
...只要提供的字符串参数不为空,否则它将在空字符串上返回0(success)...因此,如果您在脚本中使用它并在变量中传递名称/字符串例如var,那么你可能想像这样使用它:${var:-empty}如果它var是空的,那么 Bash 会将该变量扩展为单词empty... 双引号变量扩展也应该有效。
例子:
$ &>/dev/null type -afPt -- ls && echo yes || echo no
yes
$
$ &>/dev/null type -afPt -- notcommand && echo yes || echo no
no
$
$ &>/dev/null type -afPt -- set && echo yes || echo no
no
$
$ &>/dev/null type -afPt -- ./myscript.sh && echo yes || echo no
yes
$
$ &>/dev/null type -afPt -- echo && echo yes || echo no
yes
Run Code Online (Sandbox Code Playgroud)
注意:如果您要丢弃所有输出,那么您可能不需要所有这些选项,因为仅-P应足以排除 shell 内置函数和函数,因为它强制对传递的字符串中的每个单词进行路径搜索,这将排除默认情况下这两个。