Bashソース - 2つのソースファイルが同じ関数名を持つときに正しい関数を選択しますか?

Bashソース - 2つのソースファイルが同じ関数名を持つときに正しい関数を選択しますか?

file2.sh私のbashスクリプトは、パラメータに基づいてスクリプトファイル(呼び出し)を取得します。 (ソースの有無にかかわらず、どちらかです。)スクリプトには、file2.sh「foo」関数(fooの修正または改良版と呼ばれる)が含まれています。

スクリプトは、file1.sh元の関数"foo"を含む他のファイル()も取得します。これfile1.shは常にソースです(そして必要な他の機能もあります)。

file2.shfile1.sh(ソースの場合)の「foo」をオーバーライドするには、「foo」関数が必要ですfile2.sh

また、基本スクリプトで呼び出されるすべてのスクリプトでこれを行う必要があります。スクリプトファイルと呼ばれるいくつかのソースコードも同様ですfile1.sh。彼らは元の「foo」機能を期待しています。ただし、変更せずに改善された「foo」を呼び出す必要があります。

つまり、メインスクリプトに「foo」が含まれている場合は、代わりに「foo」を使用するfile2.shソーススクリプト(メインスクリプトによって呼び出されます)が必要です。デフォルトスクリプト以外のファイルは変更できません。 (または変更する場合は、基本スクリプトでソースが提供されていないときに正しく機能するために必要です。)file1.shfile2.shfile2.sh

ベストアンサー1

file2.shでは、機能を「読み取り専用」として表示できます。

注:これにより、file1.shが後で関数を定義(再定義)しようとすると警告が発生します。

これらの警告はstderrに表示され、問題を引き起こす可能性があります。無効にできるかどうかはわかりません。

追加の注:スクリプトが関数定義の戻り状態を確認すると、スクリプトが失敗する可能性があります。スクリプトの実行を中断するためにどこでもゼロ以外の戻り状態を発生させるbashオプションを設定することも可能であると思います。頑張ってください!

file1.shを修正できますか?関数を定義する前に、条件を使用して関数が定義されているかどうかを確認することがより安定した解決策になります。

これは「読み取り専用」の使用例です。

hobbes@metalbaby:~/scratch$ mkdir bash-source-test
hobbes@metalbaby:~/scratch$ cd bash-source-test
hobbes@metalbaby:~/scratch/bash-source-test$ cat > file2.sh
#!/bin/bash
fname(){
  echo "file2"
}

readonly -f fname
hobbes@metalbaby:~/scratch/bash-source-test$ cat > file1.sh
#!/bin/bash
fname(){
  echo "file1"
}

readonly -f fname
hobbes@metalbaby:~/scratch/bash-source-test$ cat >top.sh
#!/bin/bash 
if [ $1 ]; then
source file2.sh
fi  
source file1.sh

fname
hobbes@metalbaby:~/scratch/bash-source-test$ chmod +x *.sh
hobbes@metalbaby:~/scratch/bash-source-test$ ./top.sh 
file1
hobbes@metalbaby:~/scratch/bash-source-test$ ./top.sh hello
file1.sh: line 4: fname: readonly function
file2
hobbes@metalbaby:~/scratch/bash-source-test$ 

おすすめ記事