如何在源自另一个 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为什么有两个source outer,第二个不应该有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

相关内容