-aを設定した後、bashからいくつかの簡単な機能を取得できませんか?

-aを設定した後、bashからいくつかの簡単な機能を取得できませんか?

/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" "$@" ; }

(ところで、自分自身を再帰的に呼び出す関数を生成します)。

でこれらの名前の関数を定義できますが、エクスポートすることbashbashできません。試してみると、次のようexport -f /users/avnamn/bin/pricerbash報告されます。

bash: line <n>: export: /users/avnamn/bin/pricer: cannot export

まだallexport機能の使用はいそれにもかかわらずまだエクスポートされますが(バグと考えることができます)、その環境内で呼び出される後続のシェルはインポートを拒否するため、実行時にbash新しい呼び出しを開始するように求められます。./script.shbash

bashのエクスポートされた関数機能は非常に危険な機能(特にこの機能があるシステムではshbash)なので、注意して使用する必要があります。

このallexport関数は非常に危険であり、特にbash関数のエクスポートも含みます。いいえインタラクティブシェルでタスクを実行したいと思います。

exportここで明示的に呼び出さずに複数の変数を環境にエクスポートするには、次のことをお勧めします。

set -o allexport
  A=1
  B=2
  ...
set +o allexport

(そしてそのコードセクションで関数を宣言しないでください)。

エイリアスは、cshに機能がない貧しい人のための機能です。 Kornなどのシェルは、関数を使用して実行できない操作、つまり新しいコマンドを定義するのではなく、いくつかのコード変換を実行したい場合にのみ役立ちます。ほとんどの場合、これを避けるのが最善です。

おすすめ記事