Bash
遞歸顯示相對於目前目錄的所有父目錄
遞歸顯示相對於目前目錄的所有父目錄。
#!/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
任何組件都不是符號連結的直接情況下,您的程式碼也會輸出一個空行,path
,to
並且dir
它們都不是目前目錄的祖先目錄,/
而是/path
,/path/to
。