簡體   English   中英

如何從另一個shell腳本調用一個shell腳本?

[英]How to call one shell script from another shell script?

我有兩個shell腳本a.shb.sh

我怎么能叫b.sh從shell腳本中a.sh

有幾種不同的方法可以做到這一點:

  1. 使另一個腳本可執行,在頂部添加#!/bin/bash行,並將文件所在的路徑添加到 $PATH 環境變量。 然后就可以作為普通命令調用了;

  2. 或者使用source命令(別名是. )調用它,如下所示: source /path/to/script ;

  3. 或者使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM