ファイルにbash
関数を定義しました~/.bashrc
。これにより、シェルターミナルで使用できます。ただし、スクリプト内から呼び出すと、存在しないようです。
bash
スクリプトで使用される関数をどのように定義できますか?
/bin/sh
シバンラインで使用していますか?
ファイルにbash
関数を定義しました~/.bashrc
。これにより、シェルターミナルで使用できます。ただし、スクリプト内から呼び出すと、存在しないようです。
bash
スクリプトで使用される関数をどのように定義できますか?
/bin/sh
シバンラインで使用していますか?
回答:
~/.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
です。これははるかに移植性が高く、特定の方法で設定されている環境に依存しません。
function myFunction { ... }
inのような関数を宣言するだけで、準備完了~/.bash_profile
です。
export
ソリューションは適切に機能するようです。ありがとう。
foo
機能を必要とすることを認識していますfile
2)file
呼び出しシェルfoo
スクリプトを呼び出す前に変更されませんでした。file
たとえば、安全性チェックを追加して、改ざんされていないことを確認できます。(簡単ではありませんが、可能です)。(まあ、あなたはまた、定義されたfooという関数にこれらのチェックを行うことができます...しかし、あなたは、私は方法2がきれいだと思います^^私のドリフトを取得します。)3)file
だけでなく、より多くの、必要なものが含まれます。
.bashrc
対話型シェルによってのみ読み取られます。バッシュは読まないbashはこの点で風変わりです:。(実際には、それは単純化し過ぎだ.bashrc
インタラクティブ、それがログインシェルだ場合か、例外も例外にあります:bashの者の親プロセスがある場合rshd
やsshd
、その後のbashを読んでありません.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"
}
機能が必要ですか?そうでない場合は、ロジックを別のスタンドアロンBashスクリプトに引き出してください$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セッションだけでなく)。このスクリプトは、同じロジックとドキュメントをうまくカプセル化します。