4

ソース化されたシェル スクリプトに独自の場所を決定させようとしていますが、これはダッシュにとって難しい作業であることがわかりました。

bash、sh、および csh では、次を使用できます$_

魚では、 を使用できます(status -f)

ダッシュで、私は運がなかった...

以下に示す path.sh ファイルのソースを試してみましたが、次の結果が得られました。

# path.sh
called=$_
echo called:      $called
echo underscore:  $_
echo zero:        $0
echo dash_source: $DASH_SOURCE
echo bash_source: $BASH_SOURCE

dash -c ". path.sh"

出力:

called:      /usr/local/bin/dash
underscore:  /usr/local/bin/dash
zero:        dash
dash_source:
bash_source:

ダッシュでpath.shへのパスを取得するにはどうすればよいですか?

4

4 に答える 4

3

これを行う移植可能な (POSIX 標準の) 方法はないようです。

POSIX では、ソーシングを「ドットスクリプト」と呼んでいます。シェル言語リファレンスの他のいくつかの部分では「ドット スクリプト」について説明していますが、これらのインスタンスのいずれも、現在実行中のドット スクリプトへのパスを見つける方法を提供していないようです。特に、$0「ドット スクリプト」とは別のものである「シェル スクリプト」用に予約されています。「ソース」という単語は、ページ上に大文字で表示されたり、より大きな単語の一部として表示されたりすることはありません (したがって、-の$BASH_SOURCEようなものはありません)。シェルに影響を与える標準の環境変数もどれも関連していないようです。これはPOSIX仕様では不可能だと言います。Dash は POSIX に非常に厳密に従っているため、この特定のケースに Dashism がある可能性は低いです (そうするつもりなら、'$BASH_SOURCEまたは類似の変数を作成します)。

于 2015-10-06T23:42:20.330 に答える
1

これは、POSIX シェル標準 (これdashは実装されていますが、それ以上のものではありません) では不可能です。 .は組み込みであり、シェル スクリプトではないため、$0位置引数は の呼び出し元を.参照$1し、存在する場合はその呼び出し元への引数を参照します。特に、これらのいずれも、.それ自体またはその引数スクリプトを参照していません。

于 2016-08-30T01:21:36.523 に答える
0

ソースのコードを変更できる場合は、この関数をすべてのソース呼び出しの前に置きます。

.() {
   command . "$1"
}
. script.sh
# more dot scripts

「ドットスクリプト」関数をフックするのは何ですか。関数内では、位置パラメータが関数パラメータです。したがって、ソース スクリプト内では、位置パラメーターは次のようになります。

.         # $0
script.sh # $1

ソースとなるスクリプトの内部:

# script.sh
echo "$(basename "$1")"     # this is the name of the script itself
于 2016-08-30T03:20:00.863 に答える