Bash
獲取文件 OS X 的絕對路徑
我正在創建一個腳本,它將提示使用者輸入文件的位置,並將其轉換為絕對路徑。
這就是我到目前為止所擁有的。我不確定如何將這些附加在一起。
absolute.sh
read -e -p "Enter a path to a file: " PATH CONVERTPATH="$(pwd $PATH)" "/" "$(basename $PATH)" echo Absolute path is $CONVERTPATH
對於appending,您需要做的就是去掉多餘的引號,例如,更改
CONVERTPATH="$(pwd $PATH)" "/" "$(basename $PATH)"
到
CONVERTPATH="$(pwd $PATH)/$(basename $PATH)"
但是有幾個問題:
pwd
不接受爭論;您可以dirname
在提供的情況下使用。- 該
read
命令不會設置PATH
;重命名它,例如,name
- 該
echo
命令被不完全引用通過這些修復,您將擁有:
#!/bin/bash read -e -p "Enter a path to a file: " name CONVERTPATH="$(dirname $name)/$(basename $name)" echo "Absolute path is $CONVERTPATH"
它不處理有人用變數回复提示的情況。此外,預期用途
pwd
很可能獲得絕對目錄。您可以通過進一步替換來嘗試#!/bin/bash read -e -p "Enter a path to a file: " name head=$(dirname "$name") head=$(cd "$head" && pwd) CONVERTPATH="$head/$(basename $name)" echo "Absolute path is $CONVERTPATH"
但是,它仍然不會做你想做的事。問題(從您的角度來看)是
pwd
在 OSX 上將簡單地根據cd
命令中的任何符號連結回顯結果。這不僅是 OSX 的怪癖,而且是長期存在的 Unix 行為,例如,它允許您通過跟踪條目鏈cd
進入一個您無權執行適當操作的目錄。pwd``..
如果您想要一個在其結果中沒有任何符號連結的絕對路徑名,則需要一種不同的方法。OSX 有
realpath
——但不在命令行上。在其他一些系統上,您可以使用readlink -f
,但在這裡不行。有關此主題的一般性討論: