shell 腳本應該在絕對路徑還是相對路徑下工作?

shell 腳本應該在絕對路徑還是相對路徑下工作?

我正在將一些批次腳本轉換為 shell 腳本。批次腳本具有 cd 命令,但仍然使用絕對路徑。

foo.bat:

pushd
cd C:\some\directory
copy C:\some\directory\foo.txt C:\some\other\directory
popd

我認為此腳本中的 cd 是多餘的,因為正在複製的檔案是使用絕對路徑呼叫的。我需要將其轉換為 shell 腳本。我有以下兩個選擇:

測試1.sh:

cp /some/directory/foo.txt /some/other/directory

測試2.sh:

cd /some/directory
cp foo.txt /some/other/directory

第一個僅使用 cp 和絕對路徑,第二個使用 cd 和相對路徑。

我的問題是:就在 shell 腳本中使用路徑而言,這兩個範例中哪一個是更好的做法?

作為一個附帶問題,這些範例中是否需要 pushd/popd ?

答案1

調用腳本不一定是壞事cd,但應該謹慎行事。多次呼叫會cd產生“代碼味道”。絕對路徑通常較可取。

cd可能會失敗。請務必正確處理錯誤。

呼叫 後cd,相對路徑將變得無效。特別是,如果您正在編寫一個包裝器腳本來準備一些內容,然後執行另一個命令,則永遠不要呼叫cd:使用者可能依賴在原始目錄中執行的命令。如果您的腳本使用在命令列上傳遞的檔案名,它們通常是相對於原始目錄的;你可以"$PWD/"在它們前面加上絕對值,但是如果出現問題,這會導致錯誤訊息。

該變數PWD始終包含當前目錄,因此您可以將其保存到另一個變數中,並透過cd稍後呼叫變更回來。但是,請注意,這在某些邊緣情況下可能會失敗,例如以低權限運行的腳本不允許更改回其原始目錄,或在腳本運行時移動的目錄。

請注意相對路徑:它們可以以 開頭,如果您不採取預防措施,-以 開頭的命令參數將被解釋為選項。-絕對路徑則不存在這個問題。

答案2

根據我的經驗,這主要取決於您的需求和偏好,
您會發現許多文件將其留給使用者。這是我注意到的:

  • 絕對路徑更清晰:誰將不得不維護/修改您的腳本(您或其他人)將能夠知道每次涉及哪些目錄;
  • 使用絕對路徑,您可以確定所涉及的目錄是具有您在腳本中編寫的確切路徑的目錄;
  • 相對路徑較短,但您需要確定您正在使用的子樹;
  • 您可以在腳本開頭用變數取代重複路徑來實現簡短(例如 /var/log/app/component/module/logfile.log -> $module_log_dir/logfile.log)

正如 thrig 所注意到的,您可以在要執行的命令之前添加對所涉及目錄的檢查。

相關內容