シェルスクリプトでbash関数を定義し、それを使用して「スクリプト」をリンクします。

シェルスクリプトでbash関数を定義し、それを使用して「スクリプト」をリンクします。

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

おすすめ記事