他のtcshスクリプトで起動されたtcshスクリプトで$_をどのように正しく使用しますか?

他のtcshスクリプトで起動されたtcshスクリプトで$_をどのように正しく使用しますか?

私は他のtcshスクリプト自体から来たtcshスクリプトの中から結果を取得したいと思います$_(それぞれ内部スクリプトと外部スクリプトと呼びます)。しかし、$_私が期待した値(つまり、最後に実行されたコマンド)は設定されていません。

外部コード:

#!/usr/bin/tcsh

set lastCmd0 = ($_)
echo "${lastCmd0}"
echo "$0"
source inner
echo "enOuter"

内部コード:

#!/usr/bin/tcsh

set lastCmd1 = ($_)
echo "${lastCmd1}"
echo "$0"
echo "endInner"

呼び出し時の出力は次のとおりですsource outer

source outer 
tcsh
source outer 
tcsh
endInner
enOuter

質問1なぜ2つはありますが、source outer2つ目はあってはいけませんかsource inner

呼び出し時の出力は次のとおりです./outer

./outer

./outer
endInner
enOuter

質問2内部購入時になぜ$_設定はありませんか?

スクリプトを実行するときに$_絶対に設定されていないようですが、これが正常かどうかはわかりません。とにかく、それでも動作しない場合は、$_スクリプト内で最後のコマンドを実行する他の安全な方法はありますか?

答え1

tcshargv()コマンドにパラメータを指定したり、source変更したことがない場合は、$0エントリを更新できます$_

印刷された変数とそれを実行するスクリプトを表示するようにメッセージを変更すると、何が起こっているかを確認できます。最初の「外部」:

#!/usr/bin/tcsh

set lastCmd0 = ($_)
echo 'O:$lastCmd0'"=${lastCmd0}"
echo 'O:$0'"=$0"
source inner
echo 'O:endOuter'

それから「内部」

#!/usr/bin/tcsh

set lastCmd1 = ($_)
echo 'I:$lastCmd1='"${lastCmd1}"
echo 'I:$0'"=$0"
echo 'I:endInner'

出力:

> tcsh -f
> source ./outer
O:$lastCmd0=source ./outer 
O:$0=tcsh
I:$lastCmd1=source ./outer 
I:$0=tcsh
I:endInner
O:endOuter

そして

> source ./outer first second
#argv: 2
O:$lastCmd0=source ./outer first second 
O:$0=tcsh
I:$lastCmd1=source ./outer first second 
I:$0=tcsh
I:endInner
O:endOuter

関連情報