Shell
確定源 shell 腳本的路徑
有沒有辦法讓源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
。