さまざまなスクリプトで使用できるBash関数を定義する方法

さまざまなスクリプトで使用できるBash関数を定義する方法

私のファイルに定義された関数がありますbash~/.bashrcこれにより、シェル端末で使用できます。ところでスクリプトから呼び出してみると存在しないようです。

bashスクリプトで使用できる関数をどのように定義できますか?

答え1

~/.bash_profileスクリプトとして読み込まれず、デフォルトで~/.bashrcは関数はエクスポートされません。これを行うには、export -f次のように使用できます。

$ cat > script << 'EOF'
#!/bin/bash
foo
EOF
$ chmod a+x script
$ ./script
./script: line 2: foo: command not found
$ foo() { echo "works" ; } 
$ export -f foo
$ ./script
works

export -f foo~/.bash_profileこの関数は、ログイン後にスクリプトで使用できるように呼び出すこともできます。携帯できませんのでご注意くださいexport -f

より良い解決策はを使用することです. file。これは、移植性に優れ、特定の方法で設定された環境に依存しません。

答え2

.bashrcインタラクティブシェルでのみ読み取ることができます。 (実際にこれはあまりにも単純化されています。bashはこの点で奇妙です。Bashは.bashrcそれが対話型ログインシェルであるかどうかを読みません。そしてその例外にも例外があります:bashの親プロセスがorの場合、rshdbashsshdはそれを読みますです.bashrc

既知の場所にあるファイルに関数定義を配置し、組み込み関数.(とも呼ばれる)を使用してsourceそのファイルをスクリプトに含めます。

$ cat ~/lib/bash/my_functions.bash
foo () {
$ cat ~/bin/myscript
#!/bin/bash
. ~/lib/bash/my_functions.bash
foo bar

必要に応じて、kshの自動ロード機能に従うことができます。各関数定義を関数と同じ名前のファイルに保存します。変数に関数定義を含むディレクトリFPATH(コロンで区切られたディレクトリのリスト)を一覧表示します。以下は、autoload要求時にではなくすぐに関数をロードするkshのおおよその近似です。

autoload () {
  set -- "$(set +f; IFS=:;
            for d in $FPATH; do
              if [ -r "$d/$1" ]; then echo -E "$d/$1"; break; fi;
            done)"
  [[ -n $1 ]] && . "$1"
}

答え3

あなた必要機能?そうでない場合は、ロジックを次のように抽出してみてください$PATH~/.bashrc

# echo public IP address
alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'

~/bin私は次のように$PATH生成~/bin/wanipします。

#!/bin/bash

# echo public IP address
dig +short myip.opendns.com @resolver1.opendns.com

chmod 0755 ~/bin/wanip実行可能にするために実行してください。これでwanip他のスクリプトで実行できます。

私はwanipスタンドアロンのBashスクリプトを使うのが好きです。このロジックを普遍的に使用できるようにしたいことを思い出させます(現在の対話型Bashセッションを除く)。スクリプトはロジックとドキュメントを非常によくカプセル化します。

関連情報