特定のコマンドの正規パスを必要とするスクリプトを作成しています。実際のコマンドを指すシンボリック リンクが存在する可能性があるため、readlink -f
正規パスを取得するために を使用します。しかし、 では実際に必要な結果が得られませんreadlink -f
。次の例で説明します。
現在のディレクトリが次のとおりだとします:/home/user/Documents
のパスを取得しようとすると、sleep
次readlink -f
のようになります:
/home/user/Documents/sleep
私が本当に望んでいるのは/bin/sleep
答え1
readlink -f "$(type -P sleep)"
またはパフォーマンスを重視する場合:
cpath="$(type -P sleep)"; [ ! -L "$cpath" ] || cpath="$(readlink -f "$cpath")"
readlink -e
の代わりに (existing)を使用するとreadlink -f
、存在しないファイルに対して操作を行うというこの種の事故を防ぐことができます。
2 番目の例では、 によって返されるパスがtype -P
正規であると想定しています。つまり、パスに非正規のコンポーネントが含まれていないと想定しています。