/tmp/variables.sh
次のように設定された関数と変数を含むファイルがあります。
#!/bin/bash
set -a
foo=bar
reader() { "/users/avnamn/bin/reader4" "$@" ; }
pricer() { "/users/avnamn/bin/pricer" "$@" ; }
sget() { "/users/avnamn/bin/sget17" "$@" ; }
sourced=yes
/tmp/script.sh
そして、次のスクリプトがあります。
#!/bin/bash
if [[ "$sourced" != "yes" ]]
then
source "$(dirname "$0")/variables.sh"
fi
Bashでは、以下を実行します。
$ cd "/tmp/"
$ source ./variables.sh
$ ./script.sh
シェルの応答は次のとおりです。
bash: error importing function definition for `/users/avnamn/bin/pricer'
bash: error importing function definition for `/users/avnamn/bin/sget'
pricer
インポートすると問題が発生しますが、なぜインポートsget
では問題が発生しませんかreader
?
ベストアンサー1
set -a
(別名set -o allexport
)を使用してbash
すべてをエクスポートする機能変数に加えて、それ以降も宣言されます。
エラーメッセージは表示bash
できません。輸入/users/avnamn/bin/pricer
ではなく名前の関数ですpricer
。
おそらくこれを実行する前に、source ./variables.sh
次のことを実行していたでしょう(おそらく起動ファイルの1つから):
alias pricer=/users/avnamn/bin/pricer
したがってsource
、読むとき:
pricer() { "/users/avnamn/bin/pricer" "$@" ; }
エイリアス拡張によって次に変換されます。
/users/avnamn/bin/pricer() { "/users/avnamn/bin/pricer" "$@" ; }
(ところで、自分自身を再帰的に呼び出す関数を生成します)。
でこれらの名前の関数を定義できますが、エクスポートすることbash
はbash
できません。試してみると、次のようexport -f /users/avnamn/bin/pricer
にbash
報告されます。
bash: line <n>: export: /users/avnamn/bin/pricer: cannot export
まだallexport
機能の使用はいそれにもかかわらずまだエクスポートされますが(バグと考えることができます)、その環境内で呼び出される後続のシェルはインポートを拒否するため、実行時にbash
新しい呼び出しを開始するように求められます。./script.sh
bash
bashのエクスポートされた関数機能は非常に危険な機能(特にこの機能があるシステムではsh
!bash
)なので、注意して使用する必要があります。
このallexport
関数は非常に危険であり、特にbash
関数のエクスポートも含みます。いいえインタラクティブシェルでタスクを実行したいと思います。
export
ここで明示的に呼び出さずに複数の変数を環境にエクスポートするには、次のことをお勧めします。
set -o allexport
A=1
B=2
...
set +o allexport
(そしてそのコードセクションで関数を宣言しないでください)。
エイリアスは、cshに機能がない貧しい人のための機能です。 Kornなどのシェルは、関数を使用して実行できない操作、つまり新しいコマンドを定義するのではなく、いくつかのコード変換を実行したい場合にのみ役立ちます。ほとんどの場合、これを避けるのが最善です。