bashシェルスクリプトにファイルを含める方法


121

シェルスクリプトに別のシェルスクリプトを含めて、その機能にアクセスできるようにする方法はありますか?

PHPでの方法のincludeように、他のPHPファイルでディレクティブを使用して、関数名を呼び出すだけで、そこに含まれる関数を実行できます。



@Troubadour参照ありがとうございます。投稿はsourceコマンドに言及していますが、問題自体はsourceファイルの場所を特定する方法を尋ねています。
Mechaflash 2012年

1
「基本的な質問」はスタックオーバーフローの触媒です。このサイトは他のサイトと同様にインデックスに登録され、「bashシェルスクリプトにファイルを含める方法」がスタックオーバーフローへのGoogleリンクに表示されるため、サイトのトラフィックと露出が増加することを理解しています。= D
Mechaflash

3
あなたは賢いね!あなたの素晴らしさをありがとう!
Mechaflash

4
@Troubadour、それが私がページにたどり着いた方法であるとき、ユーザーが答えをググったはずだとコメントするのはばかげています。たとえば、今日、この特定の質問は、「bashインクルードファイル」に対するGoogleの上位の結果でした。他の解決策を見つけるためにこの回答をスキップする必要がありましたか?
lwitzel

回答:


192

単にあなたのスクリプトの中に入れてください:

source FILE

または

. FILE # POSIX compliant

$ LANG=C help source
source: source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.

17
ご了承ください 。ソースはPOSIXに準拠していません
Mathieu_Du 2015

しかし、ここでのソースは、C言語の場合とまったく同じインクルードではありません。ここで、ソースはメインスクリプトに子スクリプトを実行しています。子スクリプトから特定の関数を呼び出すだけの場合はどうなりますか?
Paresh Mayani

8
混同しないようにしてください. script.sh./script.sh。私は何が起こっているのかを理解しようとして何時間も費やしました
Tihomir Mitkov

ながら。POSIXに準拠しているため、sh、dash、zsh、その他のPOSIXシェルで動作します。使用することをお勧めします。一部のシェルには独自の類似の「ソース」バージョンがあり、アプリが破損する可能性があります。
Jacob Korba

51

上記は正解ですが、他のフォルダでスクリプトを実行すると問題が発生します。

たとえば、a.shb.shは同じフォルダーにあり、インクルードbで . ./b.shインクルードします。

フォルダーなどからスクリプトを実行するとxx/xx/xx/a.sh、ファイルb.shが見つかりません:./b.sh: No such file or directory

私が使う

. $(dirname "$0")/b.sh

33

はい、ソースまたは短い形式を使用します.

. other_script.sh

3
.バージョンがshBashと同様に機能することに注意してください。「ソース」はBashでのみ機能します。
Sridhar Sarnobat

2

私の状況ではcolor.sh、の同じディレクトリからインクルードするために、init.sh次のようにする必要がありました。

. ./color.sh

直接./ではなく、なぜなのかわかりませんcolor.sh。内容color.shは以下の通りです。

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

を利用しFile color.shてもエラーにはなりませんが、色は表示されません。私はこれをテストしましたがUbuntu 18.04Bashバージョンは次のとおりです:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)


これは、現在の作業ディレクトリにあるファイルを提供するだけで、そこにあるディレクトリでinit.shはありません(./init.sh最初にそれを起動した場合、それらは一致します)。
ricab

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.