一般包含腳本的方式是「源」 shell
例如: 數組
main.sh: bash
#!/bin/bash source incl.sh echo "The main script"
incl.sh: 函數
echo "The included script"
執行「./main.sh」的輸出是: spa
The included script The main script
...如今,若是您嘗試從其餘位置執行該shell腳本,除非它在您的路徑中,不然沒法找到包含。 code
確保腳本能夠找到包含腳本的好方法是什麼,特別是若是腳本須要可移植? 進程
我知道我遲到了,但不管你如何啓動腳本並專門使用內置函數,這都應該有效: ip
DIR="${BASH_SOURCE%/*}" if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi . "$DIR/incl.sh" . "$DIR/main.sh"
.
(dot)命令是source的別名, $PWD
是工做目錄的路徑, BASH_SOURCE
是一個數組變量,其成員是源文件名, ${string%substring}
從$ string後面BASH_SOURCE
$ substring的最短匹配 同步
使用source或$ 0不會爲您提供腳本的真實路徑。 您可使用腳本的進程ID來檢索其真實路徑 string
ls -l /proc/$$/fd | grep "255 ->" | sed -e 's/^.\+-> //'
我正在使用這個腳本,它一直很好地服務於我:)
我傾向於使個人腳本彼此相對。 那樣我就可使用dirname:
#!/bin/sh my_dir="$(dirname "$0")" "$my_dir/other_script.sh"
若是它在同一目錄中,則可使用dirname $0
:
#!/bin/bash source $(dirname $0)/incl.sh echo "The main script"
我建議你建立一個setenv腳本,其惟一目的是爲整個系統中的各類組件提供位置。
而後,全部其餘腳本將獲取此腳本,以便使用setenv腳本在全部腳本中使用全部位置。
這在運行cronjobs時很是有用。 在運行cron時,您得到了最小的環境,但若是您首先使全部cron腳本都包含setenv腳本,那麼您就能夠控制和同步您但願cronjobs執行的環境。
咱們在構建猴子上使用了這種技術,用於在大約2,000 kSLOC的項目中進行持續集成。