現在のディレクトリに基づいてすべての親ディレクトリを繰り返し表示します。

現在のディレクトリに基づいてすべての親ディレクトリを繰り返し表示します。

現在のディレクトリに基づいてすべての親ディレクトリを繰り返し表示します。

#!/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$PWDpwd$PWD/foo/bar/baz/foo/bar
  • では、Split + globはbashリストコンテキスト(このループステートメントの一部)で引用符(または)なしで$(pwd)呼び出されます。に設定して分割セクションを構成しましたが、グローバルセクションを無効にすることを忘れました(使用)。名前が指定されたディレクトリの場合、そのディレクトリは ""、"tmp"、および現在のディレクトリに隠されていないすべてのファイルに分割+グローブされます。$PWDinfor$IFS/set -o noglob$PWD/tmp/*
  • echo任意のデータの出力には使用できません。この方法はbash通常、名前付きディレクトリに構築および構成され、何も出力しませ/tmp/-Eneecho -Ene。後に改行文字が続くものを出力するには、代わりにを使用してくださいprintf '%s\n' "$var"
  • $PWDaのコンポーネントのどれもシンボリックリンクではなく、現在のディレクトリの祖先ではない、およびのコンポーネントがない直接的な場合でも、/path/to/dirコードは空行を出力します。pathtodir//path/path/to

おすすめ記事