Bash

遞歸顯示相對於目前目錄的所有父目錄

  • March 31, 2022

遞歸顯示相對於目前目錄的所有父目錄。

#!/bin/bash
IFS=/
for var in $(pwd)
do
echo "$var"
done

您可以執行以下操作:

(
 while
   [ "$PWD" != / ] && cd -P ..
 do
   pwd
 done
)

然而,至少存在一種程式碼可能在無限循環中執行的病態情況:噹噹前目錄已被刪除時。在這種情況下,我發現至少在 GNU/Linux 和 bash-5.0 上,當 bash 它不是互動式時,會cd -P ..輸出錯誤但不會返回失敗退出狀態。然後,$PWD變成.和後續cd -P ..的什麼都不做。更改循環退出條件以 [ "$PWD" != / ] && [ "$PWD" != . ] && cd -P .. 解決那裡的問題。

關於您的方法的一些評論:

  • $(pwd)擴展為pwd減去尾隨換行符的輸出,因此如果目前目錄以換行符結尾,它將無法正常工作。
  • 在 POSIX 中,shell$PWD保存了目前工作目錄的路徑,這就是pwd列印的內容。但是請注意,除非您使用到達那裡cd的選項,否則儲存的路徑和輸出可能包含符號連結組件。如果是並且該文件是符號連結,則其父目錄可能不是.-P``$PWD``pwd``$PWD``/foo/bar/baz``/foo/bar
  • in bash,在列表上下文中(例如在該循環語句的部分中)不加引號$(pwd)(或)呼叫 split+glob。您確實通過設置為配置了拆分部分,但忘記禁用 glob 部分(使用)。如果是一個名為 的目錄,則該目錄將被拆分為“”、“tmp”以及目前目錄中的所有非隱藏文件。$PWD``in``for``$IFS``/``set -o noglob``$PWD``/tmp/*
  • echo不能用於輸出任意數據。該方式bash通常是在一個名為/tmp/-Ene的目錄中建構和配置的,echo -Ene不會輸出任何內容。要輸出後跟換行符的內容,請printf '%s\n' "$var"改用。
  • 即使在 a$PWD/path/to/dir任何組件都不是符號連結的直接情況下,您的程式碼也會輸出一個空行,pathto並且dir它們都不是目前目錄的祖先目錄,/而是/path, /path/to

引用自:https://unix.stackexchange.com/questions/697543