我尝试从另一个 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为什么有两个source outer
,第二个不应该有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