判断目录是否在LD_LIBRARY_PATH中失效,如何实现仅添加一次目录?
问题分析与解决
你的命令之所以会在目标目录已经存在于LD_LIBRARY_PATH时仍然输出"passed",核心问题是**grep的使用方式错误**。
原命令的问题
你写的命令:
if !(grep --quiet "libBigWig/include" $LD_LIBRARY_PATH); then echo "passed"; fi
这里的$LD_LIBRARY_PATH会被shell展开成冒号分隔的路径列表(比如/etc:/etc/lib64:/path-to-lib/libBigWig/include),而grep会把这些路径当作要搜索的文件名,而不是搜索目标字符串是否在LD_LIBRARY_PATH这个环境变量的内容里。
因为这些路径大多是目录(比如/etc),grep无法在目录里搜索内容,会返回非0的退出状态码,再加上!(...)取反,就会执行echo "passed",这和你预期的逻辑完全相反。
正确的实现方式
方法1:用echo传递环境变量内容给grep
把LD_LIBRARY_PATH的值通过管道传给grep,让它搜索字符串是否存在:
if ! echo "$LD_LIBRARY_PATH" | grep --quiet "libBigWig/include"; then echo "passed" # 这里可以添加你的导出命令,比如:export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/new/path" fi
注意要给$LD_LIBRARY_PATH加上双引号,避免当环境变量包含空格或特殊字符时出现解析错误。
方法2:用case语句(更高效,无需调用外部命令)
如果想避免调用grep,可以用shell内置的case语句来匹配字符串:
case "$LD_LIBRARY_PATH" in *libBigWig/include*) # 路径已存在,什么都不做 ;; *) echo "passed" # 添加导出命令 # export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/your/new/path" ;; esac
这种方式不需要启动额外的进程,性能更好,也更可靠。
内容的提问来源于stack exchange,提问作者CPak
相关产品推荐
相关产品推荐

