Bash

獲取文件 OS X 的絕對路徑

  • April 16, 2019

我正在創建一個腳本,它將提示使用者輸入文件的位置,並將其轉換為絕對路徑。

這就是我到目前為止所擁有的。我不確定如何將這些附加在一起。

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,但在這裡不行。

有關此主題的一般性討論:

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