bash意思 - linux bash



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

我有兩個shell腳本, b.shb.sh

我如何從shell腳本b.sh調用b.sh


依賴於取決於。 簡而言之...如果您想在當前控制台上加載變量並執行,您可以在代碼上使用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

我希望能幫助你。 謝謝。


假設新文件是“/ home / satya / app / app_specific_env”,文件內容如下

#!bin/bash

export FAV_NUMBER="2211"

將此文件引用追加到〜/ .bashrc文件

source /home/satya/app/app_specific_env

當您重新啟動機器或重新登錄時,請嘗試在終端中echo $FAV_NUMBER 。 它會輸出該值。

以防萬一你想立即看到效果,請在命令行中輸入source ~/.bashrc


從其他文件導入功能有一些問題。
第一 :你不需要做這個文件可執行文件。 最好不要這樣做! 只需添加

. file

導入所有功能。 並且它們都將如同它們在您的文件中定義一樣。
第二 :您可能會定義具有相同名稱的功能。 它將被覆蓋。 這不好。 你可以這樣申報

declare -f new_function_name=old_function_name 

並且只有在那之後才能導入。 所以你可以用新名稱來調用舊函數。
第三 :您只能導入文件中定義的完整功能列表。 如果有些不需要,你可以解除它們。 但是如果你在未設置之後重寫你的函數,它們將會丟失。 但是,如果您按照上述說明設置參考,則可能會在使用相同名稱取消設置後進行恢復。
最後在通常的進口程序是危險的,並不那麼簡單。 小心! 您可以編寫腳本來更輕鬆,更安全地完成此操作。 如果只使用部分功能(不是全部),則可以將它們更好地分割為不同的文件。 不幸的是,這種技術在bash中效果不佳。 例如在python和其他一些腳本語言中,它很容易和安全。 可以使用自己的名稱部分導入僅需要的功能。 我們都希望在下一個灌木版本中完成相同的功能。 但現在我們必須寫更多的鱈魚,以便做你想做的。


您可以使用/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行。 但即使添加了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

*例如,當病毒或安全工具在設備上運行時,可能需要額外的100ms才能執行新的進程。


有幾種方法可以做到這一點。 終端執行腳本:

#!/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")

所有這些對於有空間的路徑都是正確的!


看一下這個。

#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."

簡單的來源將幫助你。 例如。

#!/bin/bash
echo "My shell_1"
source my_script1.sh
echo "Back in shell_1"

 #!/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的評論





shell