我正在尝试查找可能位于$LD_LIBRARY_PATH
.基本上我正在尝试:
find $LD_LIBRARY_PATH -name "*libdl*"
然而,上述命令失败,因为变量中有多个条目并将我的 a 分隔开:
。我收到错误:
No such file or directory
如何做到这一点?
答案1
您可以使用冒号进行分词,因为 *PATH 变量是用冒号分隔的目录列表。
取消注释以下行以保存并恢复旧的 IFS(推荐):
#oldIFS="$IFS"
IFS=:
set -o noglob # disable the glob part of the split+glob operator
# unlikely to be needed as library directories
# are unlikely to have wildcard characters in their
# name.
find -H $LD_LIBRARY_PATH -mindpeth 1 -maxdepth 1 -name "*libdl*"
#IFS="$oldIFS"
#set +o noglob
-H
如果这些组件中的任何一个是符号链接,则需要$LD_LIBRARY_PATH
。-mindepth 1
(一个 GNU 扩展,尽管现在在许多其他实现中都可以找到)以避免这些组件本身的匹配,-maxdepth
跳过在子目录中的搜索(这并不意味着由动态链接器搜索)。
Bash 简写假设默认值$IFS
和 如果已知目录不包含该默认值的任何字符$IFS
(空格、制表符和换行符)也不包含通配符,并且这些目录都不是符号链接也没有子目录,并且名称这些目录本身与模式不匹配:
find -H ${LD_LIBRARY_PATH//:/ } -name "*libdl*"
这使用了一个替换命令将每个冒号转换为一个空格(从 ksh93 复制的功能)。
使用zsh
,无需做出任何这些假设:
print -rC1 - ${(s[:])^LD_LIBRARY_PATH}/*libdl*(ND)