如何最好地包含其餘腳本?

一般包含腳本的方式是「源」 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

確保腳本能夠找到包含腳本的好方法是什麼,特別是若是腳本須要可移植? 進程


#1樓

我知道我遲到了,但不管你如何啓動腳本並專門使用內置函數,這都應該有效: 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的最短匹配 同步


#2樓

使用source或$ 0不會爲您提供腳本的真實路徑。 您可使用腳本的進程ID來檢索其真實路徑 string

ls -l       /proc/$$/fd           | 
grep        "255 ->"            |
sed -e      's/^.\+-> //'

我正在使用這個腳本,它一直很好地服務於我:)


#3樓

我傾向於使個人腳本彼此相對。 那樣我就可使用dirname:

#!/bin/sh

my_dir="$(dirname "$0")"

"$my_dir/other_script.sh"

#4樓

若是它在同一目錄中,則可使用dirname $0

#!/bin/bash

source $(dirname $0)/incl.sh

echo "The main script"

#5樓

我建議你建立一個setenv腳本,其惟一目的是爲整個系統中的各類組件提供位置。

而後,全部其餘腳本將獲取此腳本,以便使用setenv腳本在全部腳本中使用全部位置。

這在運行cronjobs時很是有用。 在運行cron時,您得到了最小的環境,但若是您首先使全部cron腳本都包含setenv腳本,那麼您就能夠控制和同步您但願cronjobs執行的環境。

咱們在構建猴子上使用了這種技術,用於在大約2,000 kSLOC的項目中進行持續集成。

相關文章
相關標籤/搜索