私は他の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 outer
2つ目はあってはいけませんかsource inner
?
呼び出し時の出力は次のとおりです./outer
。
./outer
./outer
endInner
enOuter
質問2内部購入時になぜ$_
設定はありませんか?
スクリプトを実行するときに$_
絶対に設定されていないようですが、これが正常かどうかはわかりません。とにかく、それでも動作しない場合は、$_
スクリプト内で最後のコマンドを実行する他の安全な方法はありますか?
答え1
tcsh
argv()
コマンドにパラメータを指定したり、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