現在のディレクトリに基づいてすべての親ディレクトリを繰り返し表示します。
#!/bin/bash
IFS=/
for var in $(pwd)
do
echo "$var"
done
答え1
次のことができます。
(
while
[ "$PWD" != / ] && cd -P ..
do
pwd
done
)
ただし、このコードが無限ループで実行できる病理学的状況が1つ以上あります。つまり、現在のディレクトリが削除された場合です。この場合、GNU / Linuxと少なくともbash-5.0では、bashがインタラクティブではないときにcd -P ..
エラーが印刷されますが、失敗した終了ステータスが返されないことがわかりました。それから何もしません$PWD
。この問題を解決するには、ループ終了条件を変更してください。.
cd -P ..
[ "$PWD" != / ] && [ "$PWD" != . ] && cd -P ..
あなたのアプローチに関するいくつかのコメントは次のとおりです。
$(pwd)
pwd
末尾の改行文字を引いた出力を拡張するため、現在のディレクトリが改行文字で終わると正しく機能しません。- POSIX シェルでは、
$PWD
現在の作業ディレクトリへのパスが保存され、これがpwd
印刷されます。ただし、保存されたパスと出力には、cd
オプションを使用しない限りシンボリックリンクコンポーネントを含めることができます。シンボリックリンクでファイルがシンボリックリンクの場合、親ディレクトリはそうではありません。-P
$PWD
pwd
$PWD
/foo/bar/baz
/foo/bar
- では、Split + globは
bash
リストコンテキスト(このループステートメントの一部)で引用符(または)なしで$(pwd)
呼び出されます。に設定して分割セクションを構成しましたが、グローバルセクションを無効にすることを忘れました(使用)。名前が指定されたディレクトリの場合、そのディレクトリは ""、"tmp"、および現在のディレクトリに隠されていないすべてのファイルに分割+グローブされます。$PWD
in
for
$IFS
/
set -o noglob
$PWD
/tmp/*
echo
任意のデータの出力には使用できません。この方法はbash
通常、名前付きディレクトリに構築および構成され、何も出力しませ/tmp/-Ene
んecho -Ene
。後に改行文字が続くものを出力するには、代わりにを使用してくださいprintf '%s\n' "$var"
。$PWD
aのコンポーネントのどれもシンボリックリンクではなく、現在のディレクトリの祖先ではない、およびのコンポーネントがない直接的な場合でも、/path/to/dir
コードは空行を出力します。path
to
dir
/
/path
/path/to