bashスクリプト内でbash関数を定義し、commandの後に接続しようとすると、同じスクリプトでそれを使用するのに問題がありますscript
。
最小限の作業例は次のとおりです。my_script.sh
以下を含むというファイルがあります。
#!/bin/bash
my_function () {
echo "My output"
}
my_function
script my_log.log -c my_function
実行中に戻る
My output
Script started, output log file is 'my_log.log'.
bash: line 1: my_function: command not found
Script done.
my_function
なぜ単独では認識されますが、接続後は認識されないのか理解できませんscript
。
誰かがそれを説明し、解決策を提示できますか?
ベストアンサー1
ここでの問題は、関数がスクリプト内にのみ存在するが、実行するコマンドがscript
新しいシェル(パスが格納されているシェル$SHELL
または/bin/sh
他のシェル)を呼び出すことです。新しいシェルは、ユーザーが関数を定義しない限り、関数については知りません。
シェルbash
サポート出口環境に対する機能。sh
その環境で実行されているbashへの他のすべての呼び出し(bashで実行される呼び出しも含む)は、これらの定義を取得します。
関数をエクスポートするには、次の手順を実行する必要があります。
export -f my_function
help export
シェルで見るbash
:
$ help export
export: export [-fn] [name[=value] ...] or export -p
Set export attribute for shell variables.
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
Options:
-f refer to shell functions
-n remove the export property from each NAME
-p display a list of all exported variables and functions
An argument of `--' disables further option processing.
Exit Status:
Returns success unless an invalid option is given or NAME is invalid.
それからやるべきことは、インタプリタをscript
実行しbash
た後にコマンドラインが渡されたことを確認することです-c
。正しい変数値を渡す必要があります$SHELL
。
SHELL=$BASH script -c myfunction