2

私は長く懸命に検索しましたが、$@何かを拡張する短い説明しか見つかりませんでした.

"$@"誰かが説明するか、2番目の引数としての目的の詳細な説明へのリンクを提供してくれませんか

tclsh "$0" "$@"

また、誰かのスクリプトを調べていますが、次のようなものがあります。

exec tclsh `basename $0` $*

この場合、何$*をしますか?

とても有難い。

4

2 に答える 2

4

これらは、Tcl スクリプトでよく使用されるブートストラップ スタンザの一部です。スタンザ全体を取得しましょう。

#!/bin/sh
# A Tcl comment, whose contents don't matter \
exec tclsh "$0" "$@"

最初の行は、スクリプトを Bourne シェル プログラムとして実行します (bash および他の多くのシェルは同じように動作します。これは POSIX 仕様です)。2 行目はシェルによって無視されます。3 行目 は、シェルに渡された引数を使用してシェルを tclsh に置き換えます。"$0"スクリプトの名前であり、"$@"適切な引用符を付けたすべての引数の魔法です。(${1+"$@"}一部の古いシェルの悪意のあるバグに対する回避策であることがわかる場合もあります。) 理論的にはここを省略できますがexec、これはスクリプトの残りの部分が Tcl プログラムの終了時にシステム シェルによって解釈されることを意味します。それはおそらくあなたが望むものではありません。最後に、tclsh が上記の行を確認すると、それらはすべてコメント; Tcl コメント#は、行頭 (または前にスペース) で始まり、行継続マーカーを許可した後、行末まで続きます。(はい、これは珍しいことです。しかし便利です。)

の形式basenameは、実行中のファイルへのパスを削除するという点で、かなり珍しいものです。これは、tclsh が実行するファイルを正確に認識していないことを意味する可能性があるため、おそらく良い考えではありません。同様に、$*もほとんど正しいとは言えません (すべての引数に展開されますが、引用符は使用されません。ユーザーがスペースを含むファイル名を渡すと、すぐに違いがわかります!)

最後に、最近では、次のような開始スタンザを使用することがベスト プラクティスと見なされています。

#!/usr/bin/env tclsh

より短く、エラーが発生しにくく、シェルと同じくらい標準化されています。

于 2012-08-02T10:24:27.237 に答える
4

これは実際には Tcl ではなく、bash です。最初の行で使用することは珍しくありませんでした (または珍しいことではありません) #!/bin/bash \。Tcl は次の行も無視し (\行末に があるため)、bash はそれを実行します。

$* と $@ については、bashの man ページ(Special Parameters の下) を読むことをお勧めします。`コマンド置換用で、Tcl[]

于 2012-08-01T22:32:53.377 に答える