Bash中||运算符被忽略,两条命令均执行,求解决方法
问题原因分析与解决办法
原命令的核心问题
你遇到的||被触发的根本原因是**find的退出码规则和预期不符**:
find的退出码不是由「是否找到匹配项」决定的,而是由「遍历过程中是否发生致命错误(比如权限不足、路径不存在等)」决定的。- 即便你的
find命令找到了/usr/bin并执行了-print -quit,但遍历根目录下其他文件夹时(比如/root、/proc的部分子目录),必然会遇到权限不足的问题——这些错误被2>/dev/null隐藏了,但find的整体退出码会变成非0,最终触发||后面的echo执行。
你的错误尝试解析
分组命令写法错误
你写的{find ...}不符合Bash语法:大括号前后必须加空格,且内部命令末尾必须加;,正确写法是{ find ... ; }。但即便写法正确,依然解决不了find退出码的核心问题。命令替换用法错误
$(find ...)是把find的输出当作命令执行,find输出/usr/bin后,Bash会尝试执行这个目录,自然报错-bash: /usr/bin: Is a directory,这个执行操作的退出码是非0,所以触发了后面的echo,完全偏离需求。
解决办法
方法1:让find的退出码仅由是否找到匹配项决定
通过-exec true \;让find在找到匹配项时执行true(退出码0),然后立即-quit,这样不管遍历过程中有没有错误,只要找到匹配,find的整体退出码就是0,||不会触发:
find / -ipath /usr/bin 2>/dev/null -exec true \; -print -quit || echo "Not a valid directory"
方法2:通过输出内容判断是否找到(更可靠)
不管find的退出码是什么,只要它有输出就说明找到目标,否则输出提示。用grep -q .检查输出是否非空:
if find / -ipath /usr/bin 2>/dev/null -print -quit | grep -q .; then : # 空命令,因为已经打印了路径 else echo "Not a valid directory" fi
方法3:精确检查目录存在(更高效)
如果你只是要确认/usr/bin这个目录是否存在,完全不需要用find,直接用Bash的条件判断更简单高效:
[ -d /usr/bin ] && echo "/usr/bin" || echo "Not a valid directory"
内容的提问来源于stack exchange,提问作者Korpilombolo
相关产品推荐
相关产品推荐

