web-dev-qa-db-ja.com

別のシェルスクリプトからシェルスクリプトを呼び出す方法

a.shb.shという2つのシェルスクリプトがあります。

シェルスクリプトb.sh内からa.shを呼び出す方法を教えてください。

592
Praveen

これを行うには、いくつかの方法があります。

  1. 他のスクリプトを実行可能にして、先頭に#!/bin/bash行を追加し、ファイルがある場所のパスを$ PATH環境変数に追加します。そうすれば、それを通常のコマンドとして呼び出すことができます。

  2. あるいは、sourceコマンド(別名は.)で次のように呼び出します。source /path/to/script;

  3. またはbashコマンドを使用して実行します。/bin/bash /path/to/script;

1番目と3番目のメソッドは別のプロセスとしてスクリプトを実行するため、他のスクリプト内の変数や関数にアクセスすることはできません。
2番目の方法では、最初のスクリプトのプロセスでスクリプトを実行し、他のスクリプトから変数と関数を取得して、呼び出し元のスクリプトから使用できるようにします。 

2番目の方法で、2番目のスクリプトでexitを使用している場合は、最初のスクリプトも終了します。これは1番目と3番目の方法では起こりません。

742

これをチェックしてください。

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

これを行うことができる方法がいくつかあります。スクリプトを実行するための端末

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

これはすべてスペースのあるパスには正しいです。

75

私が探していた答え:

( exec "path/to/script" )

前述のように、execは新しいプロセスを作成することなくシェルを置き換えます。 しかし 、括弧を使ってサブシェルに入れることができます。 

編集:実際は( "path/to/script" )で十分です。

51
Maxim Chetrusca

/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
14
Ranjithkumar T

簡単に言うと…現在のコンソールに変数をロードして実行したい場合は、コードに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

お役に立てば幸いです。ありがとう。

14
Douglas Bonafé

スクリプトを実行するために端末に入力したものを何でも行に追加してください。
例えば。:

#!bin/bash
./myscript.sh &

実行するスクリプトが同じディレクトリにない場合は、単にスクリプトの完全パスを使用してください。
eg: `/home/user/script-directory/./myscript.sh&

9
Anon

簡単な情報源があなたを助けてくれるでしょう。

#!/bin/bash
echo "My Shell_1"
source my_script1.sh
echo "Back in Shell_1"
7
Nitin Jawarkar

最初にあなたが呼ぶファイルをインクルードしなければなりません:

#!/bin/bash
. includes/included_file.sh

それからあなたはこのようにあなたの関数を呼ぶ:

#!/bin/bash
my_called_function
7
Ghazi Triki
pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
4
Abdennour TOUMI
 #!/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=$?
4
Valero

新しいファイルは "/ 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を入力してください。

3
Satya Kalluri
chmod a+x /path/to/file-to-be-executed

それが私が必要とした唯一のものでした。実行されるスクリプトがこのように実行可能にされれば、あなたは(少なくとも私の場合は)スクリプトを呼び出している間、sh./のような追加の操作を必要としません。

@Nathan Lilienthalのコメントに感謝します。 

2
Asqan

バッククォートを使う.

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

次に、プロデューサースクリプトの出力をコンシューマースクリプトの引数として取得します。

1
David Cabrera

一番上の答えは、呼び出されるサブスクリプトの最初の行に#!/bin/bash行を追加することです。あなたがShebangを追加したとしても、それははるかに速いです* サブシェルでスクリプトを実行して出力を取得するには、次のようにします。

$(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ミリ秒かかる場合があります。

1
cmcginty

他のファイルから関数をインポートすることにはいくつかの問題があります。
最初 :このファイルを実行可能にする必要はない。そうしない方がいいです!追加するだけ 

. file

すべての機能をインポートします。そしてそれらすべてはあたかもそれらがあなたのファイルで定義されているかのようになります。
Second :同じ名前の関数を定義することができます。上書きされます。これは悪いです。あなたはそのように宣言することができます

declare -f new_function_name=old_function_name 

したがって、古い関数を新しい名前で呼び出すことができます。
3番目 :ファイルに定義されている関数の全リストだけをインポートすることができます。しかし、設定を解除した後に関数を書き直すと、それらは失われます。しかし、上記のように参照を設定した場合は、設定解除後に同じ名前で復元することができます。
最後に インポートの一般的な手順は危険で、それほど単純ではありません。注意してください!あなたはこれをより簡単で安全にするためにスクリプトを書くことができます。残念ながら、このテクニックはうまくいきませんでした。例えばpythonや他のスクリプト言語では簡単で安全です。部分インポートで必要な機能のみを独自の名前でインポートすることが可能です。私たちは皆、次のブッシュバージョンでも同じ機能が実行されることを望んでいます。しかし今、私たちはあなたが望むことをするために多くの追加のタラを書かなければなりません。 

0
Anatoly