私はそれがどこにあるかもしれないかを見つけようとしています$LD_LIBRARY_PATH
。基本的に私は以下を試しています。
find $LD_LIBRARY_PATH -name "*libdl*"
ただし、変数に複数のエントリがあり、my 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
これらのコンポーネントの1つがシンボリックリンクの場合は必須です$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)