Shell

確定源 shell 腳本的路徑

  • March 30, 2022

有沒有辦法讓shell 腳本找出自己的路徑?我主要關心 bash,儘管我有一些使用 tcsh 的同事。

我猜我在這裡可能運氣不好,因為採購會導致命令在目前 shell 中執行,所以$0仍然是目前 shell 的呼叫,而不是源腳本。我目前最好的想法是這樣做source $script $script,以便第一個位置參數包含必要的資訊。有人有更好的方法嗎?

需要明確的是,我正在採購腳本,而不是執行它:

source foo.bash

tcsh,$_腳本的開頭將包含文件來源的位置,如果文件$0被執行則包含它。

#!/bin/tcsh
set sourced=($_)
if ("$sourced" != "") then
   echo "sourced $sourced[2]"
endif
if ("$0" != "tcsh") then
   echo "run $0"
endif

在 Bash 中:

#!/bin/bash
[[ $0 != $BASH_SOURCE ]] && echo "Script is being sourced" || echo "Script is being run"

我認為你可以使用$BASH_SOURCE變數。它返回執行的路徑:

範例腳本:

print_script_path.sh:

#!/usr/bin/env bash

echo "$BASH_SOURCE"

使其可執行:

chmod +x print_script_path.sh

對於此腳本的不同位置,範例執行及其輸出:

pbm@tauri ~ $ /home/pbm/print_script_path.sh 
/home/pbm/print_script_path.sh
pbm@tauri ~ $ ./print_script_path.sh
./print_script_path.sh
pbm@tauri ~ $ source /home/pbm/print_script_path.sh 
/home/pbm/print_script_path.sh
pbm@tauri ~ $ source ./print_script_path.sh
./print_script_path.sh

所以在下一步我們應該檢查路徑是否是相對的。如果它不是相對的,一切都很好。如果是,我們可以用 來檢查路徑pwd,用/和連接$BASH_SOURCE

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