[英]How to call one shell script from another shell script?
我有兩個shell腳本a.sh
和b.sh
。
我怎么能叫b.sh
從shell腳本中a.sh
?
有幾種不同的方法可以做到這一點:
使另一個腳本可執行,在頂部添加#!/bin/bash
行,並將文件所在的路徑添加到 $PATH 環境變量。 然后就可以作為普通命令調用了;
或者使用source
命令(別名是.
)調用它,如下所示: source /path/to/script
;
或者使用bash
命令執行: /bin/bash /path/to/script
;
第一種和第三種方法將腳本作為另一個進程執行,因此其他腳本中的變量和函數將無法訪問。
第二種方法在第一個腳本的進程中執行腳本,並從另一個腳本中提取變量和函數,以便它們可以從調用腳本中使用。
在第二種方法中,如果您在第二個腳本中使用exit
,它也會退出第一個腳本。 這不會發生在第一種和第三種方法中。
看一下這個。
#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
有幾種方法可以做到這一點。 執行腳本的終端:
#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"
# Here you execute your script
"$SCRIPT_PATH"
# or
. "$SCRIPT_PATH"
# or
source "$SCRIPT_PATH"
# or
bash "$SCRIPT_PATH"
# or
eval '"$SCRIPT_PATH"'
# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT
# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT
# or
("$SCRIPT_PATH")
# or
(exec "$SCRIPT_PATH")
所有這些對於帶空格的路徑都是正確的!!!
我正在尋找的答案:
( exec "path/to/script" )
如前所述, exec
替換 shell 而不創建新進程。 但是,我們可以將它放在子shell 中,這是使用括號完成的。
編輯:實際上( "path/to/script" )
就足夠了。
如果您在同一目錄中有另一個文件,您可以執行以下操作:
bash another_script.sh
要么
source another_script.sh
要么
. another_script.sh
當您使用bash
而不是source
,腳本無法更改父腳本的環境。 .
command 是 POSIX 標准,而source
command 是更易讀的 bash 同義詞.
(我更喜歡source
不是.
)。 如果您的腳本駐留在別處,只需提供該腳本的路徑。 相對路徑和完整路徑都應該有效。
依賴於取決於。 簡而言之...如果您想在當前控制台上加載變量並執行,您可以在代碼中使用source myshellfile.sh
。 例子:
!#/bin/bash
set -x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable
set +x
如果您只想執行一個文件,而唯一讓您感興趣的是結果,您可以執行以下操作:
!#/bin/bash
set -x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x
我希望對你有幫助。 謝謝。
您可以使用/bin/sh
調用或執行另一個腳本(通過您的實際腳本):
# cat showdate.sh
#!/bin/bash
echo "Date is: `date`"
# cat mainscript.sh
#!/bin/bash
echo "You are login as: `whoami`"
echo "`/bin/sh ./showdate.sh`" # exact path for the script file
輸出將是:
# ./mainscript.sh
You are login as: root
Date is: Thu Oct 17 02:56:36 EDT 2013
首先,您必須包含您調用的文件:
#!/bin/bash
. includes/included_file.sh
然后你像這樣調用你的函數:
#!/bin/bash
my_called_function
只需添加一行您在終端中鍵入的內容即可執行腳本!
例如:
#!bin/bash
./myscript.sh &
如果要執行的腳本不在同一目錄下,則使用腳本的完整路徑即可。
例如:`/home/user/script-directory/./myscript.sh &
簡單的來源會幫助你。 對於前。
#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"
這對我有用,這是執行另一個腳本的主 sh 腳本的內容。
#!/bin/bash
source /path/to/other.sh
最佳答案建議將#!/bin/bash
行添加到被調用的子腳本的第一行。 但是,即使您添加了shebang,在子shell 中運行腳本並捕獲輸出也會更快* :
$(source SCRIPT_NAME)
當您想繼續運行相同的解釋器(例如從 bash 到另一個 bash 腳本)並確保不執行子腳本的 shebang 行時,這會起作用。
例如:
#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash" > $SUB_SCRIPT
echo 'echo $1' >> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if [[ $1 == "--source" ]]; then
for X in $(seq 100); do
MODE=$(source $SUB_SCRIPT "source on")
done
else
for X in $(seq 100); do
MODE=$($SUB_SCRIPT "source off")
done
fi
echo $MODE
rm $SUB_SCRIPT
輸出:
~ ❯❯❯ time ./test.sh
source off
./test.sh 0.15s user 0.16s system 87% cpu 0.360 total
~ ❯❯❯ time ./test.sh --source
source on
./test.sh --source 0.05s user 0.06s system 95% cpu 0.114 total
*例如,當病毒或安全工具在設備上運行時,執行新進程可能需要額外的 100 毫秒。
#!/bin/bash
# Here you define the absolute path of your script
scriptPath="/home/user/pathScript/"
# Name of your script
scriptName="myscript.sh"
# Here you execute your script
$scriptPath/$scriptName
# Result of script execution
result=$?
chmod a+x /path/to/file-to-be-executed
那是我唯一需要的東西。 一旦要執行的腳本像這樣可以執行,您(至少在我的情況下)在調用腳本時不需要任何其他額外的操作,例如sh
或./
。
感謝@Nathan Lilienthal 的評論
pathToShell="/home/praveen/"
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
假設新建文件為“/home/satya/app/app_specific_env”,文件內容如下
#!bin/bash
export FAV_NUMBER="2211"
將此文件引用附加到 ~/.bashrc 文件
source /home/satya/app/app_specific_env
當您重新啟動機器或重新登錄時, echo $FAV_NUMBER
在終端中嘗試echo $FAV_NUMBER
。 它將輸出值。
以防萬一,如果您想立即看到效果,請在命令行中輸入source ~/.bashrc
。
從其他文件導入函數存在一些問題。
第一:您不需要執行此文件。 最好不要這樣做! 只需添加
. file
導入所有函數。 所有這些都好像在您的文件中定義了一樣。
第二:你可能定義了同名的函數。 它將被覆蓋。 這不好。 你可以這樣聲明
declare -f new_function_name=old_function_name
只有在那之后才能導入。 所以你可以用新名稱調用舊函數。
第三:您只能導入文件中定義的完整函數列表。 如果有些不需要,您可以取消設置它們。 但是如果你在 unset 之后重寫你的函數,它們就會丟失。 但是,如果您如上所述設置對它的引用,則可以在取消設置后使用相同的名稱進行恢復。
最后在普通的導入過程中是危險的,並不是那么簡單。 當心! 您可以編寫腳本來更輕松、更安全地執行此操作。 如果您只使用部分功能(不是全部),最好將它們拆分到不同的文件中。 不幸的是,這種技術在 bash 中做得不好。 例如在 python 和其他一些腳本語言中,它既簡單又安全。 可以只使用自己的名稱部分導入需要的函數。 我們都希望在下一個灌木版本中完成相同的功能。 但是現在我們必須編寫許多額外的 cod 才能做你想做的事。
使用反引號。
$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`
然后獲取生產者腳本的輸出作為消費者腳本的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.