シェルスクリプトから関数をインポートする
質問
shUnitでテストしたいシェルスクリプトがあります。スクリプト(およびすべての関数)は、インストールがはるかに簡単になるため、単一のファイルになっています。
の例です。
script.sh
#!/bin/sh
foo () { ... }
bar () { ... }
code
で定義された関数をテストするために、(配布やインストールを必要としない)2番目のファイルを書きたかったのです。
script.sh
次のようなものです。
run_tests.sh
#!/bin/sh
. script.sh
# Unit tests
さて、問題は
.
(または
source
をBashで使うこともできます)。関数定義のパースだけでなく、スクリプト内のコードも実行されます。
引数なしのスクリプトは何も悪いことをしないので、私は
. script.sh > /dev/null 2>&1
が、私の目的を達成するためにもっと良い方法がないかと考えていました。
編集
私の提案した回避策は、ソース・スクリプトが
exit
を呼び出す場合は動作しないので、終了をトラップする必要があります。
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
...
}
. script.sh
は
run_tests
関数は呼び出されますが、ソースコマンドの出力をリダイレクトするとすぐに、スクリプト内の関数は解析されず、トラップハンドラで利用できなくなります。
これは動作しますが、出力される
script.sh
:
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh
これでは出力はされませんが、関数が定義されていないというエラーが出ます。
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh | grep OUTPUT_THAT_DOES_NOT_EXISTS
これでは出力されず
run_tests
トラップハンドラは全く呼ばれません。
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh > /dev/null
どのように解決するのですか?
の「シェル組み込みコマンド」の項によると、以下のようになります。
bash manpage
,
.
別名
source
は、ソースとなるスクリプトに渡される引数のリストをオプションで取ります。それを使って、何もしないオプションを導入することができます。例えば
script.sh
はそうなる可能性があります。
#!/bin/sh
foo() {
echo foo $1
}
main() {
foo 1
foo 2
}
if [ "${1}" != "--source-only" ]; then
main "${@}"
fi
と
unit.sh
はあり得る。
#!/bin/bash
. ./script.sh --source-only
foo 3
次に
script.sh
は正常に動作し
unit.sh
のすべての関数にアクセスできるようになります。
script.sh
のすべての関数にアクセスできますが
main()
のコードは呼び出されません。
への余分な引数があることに注意してください。
source
は POSIX には存在しないので
/bin/sh
はそれを扱わないかもしれません。
#!/bin/bash
の冒頭にある
unit.sh
.
関連
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] シェルスクリプトでYYYY-MM-DD形式の日付にする
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] シェルスクリプトで部分文字列を別の文字列に置き換える
-
[解決済み] 環境変数を設定するシェルスクリプト
-
[解決済み] GNU make はスペースを含むファイル名を扱えますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] awk で複数の引数を shebang (つまり #!) で使うには?
-
[解決済み] UNIXのsortコマンドは、どのようにして非常に大きなファイルをソートすることができるのでしょうか?
-
[解決済み] バッチファイル - コマンドライン引数の数
-
[解決済み] コンソールでシステムシェルを実行するためのEclipseプラグインはありますか?[クローズド]
-
[解決済み] 環境変数を設定するシェルスクリプト
-
[解決済み] リポジトリ 'http://security.debian.org/debian-security buster/updates InRelease' の 'Suite' の値が 'stable' から 'oldstable' に変更されました [閉鎖] 。
-
[解決済み] シェルスクリプトを実行する際にJenkinsでビルドを不安定にする方法
-
[解決済み] 変数に格納されたコマンドを実行するにはどうすればよいですか?
-
[解決済み] Vagrantのプロビジョニング後にユーザとしてコマンドを実行する
-
[解決済み] シェルスクリプトで継続時間(秒)を測定するには?