私のファイルに定義された関数があります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の場合、rshd
bashsshd
はそれを読みますです.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セッションを除く)。スクリプトはロジックとドキュメントを非常によくカプセル化します。