ソースlib / *が機能しないのはなぜですか?

ソースlib / *が機能しないのはなぜですか?

次のフォルダ構造を持つ小さなプログラムがあります。

- main.sh
- lib/
  - clean.sh
  - get.sh
  - index.sh
  - test.sh

各ファイルにはiが含まれていますmain.sh

main.sh:

source lib/*

get_products
clean_products
make_index
test_index

上記の例では、最初の2つの関数は機能しますが、最後の2つの関数は機能しません。

しかし、次のように置き換えるとsource lib/*

source lib/get.sh
source lib/clean.sh
source lib/index.sh
source lib/test.sh

すべてが期待どおりに動作します。

source lib/*これが期待どおりに機能しない理由を知っている人はいますか?

ベストアンサー1

Bashのsource組み込みコマンドは単一のファイル名のみを使用します。

source filename [arguments]

最初の引数以外のすべての引数は位置引数になりますfilename

簡単な例:

$ cat myfile
echo "param1: $1"
$ source myfile foo
param1: foo

すべての出力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.

.(これは特にPOSIXなので、移植性の良い組み込みの「ポイントソース」にも適用されます。)

見ている見かけに矛盾する動作については、完了後にmain.shを実行してみることができますset -x。どの文がいつ実行されたかを確認すると、手がかりを得ることができます。

おすすめ記事