Shell &引用;设置echo";不';t似乎无法在tcsh脚本中显示代码

Shell &引用;设置echo";不';t似乎无法在tcsh脚本中显示代码,shell,debugging,csh,tcsh,Shell,Debugging,Csh,Tcsh,请不要在“你为什么要使用TCSH?”的领域中使用任何东西。我有我的理由 我试图调试tcsh脚本,但使用选项“set echo”和“set verbose”实际上似乎并没有显示我试图调试的代码 根据,我在tcsh中尝试了“设置回显”和“设置详细”。然后我运行了这个脚本“test.tcsh”: echo "Hello world" foo=1 bar=2 foobar=$(expr $foo + $bar) echo $foobar 它返回以下输出: test.tcsh tes

请不要在“你为什么要使用TCSH?”的领域中使用任何东西。我有我的理由

我试图调试tcsh脚本,但使用选项“set echo”和“set verbose”实际上似乎并没有显示我试图调试的代码

根据,我在tcsh中尝试了“设置回显”和“设置详细”。然后我运行了这个脚本“test.tcsh”:

echo "Hello world"
foo=1
bar=2
foobar=$(expr $foo + $bar)
echo $foobar
它返回以下输出:

test.tcsh
test.tcsh
Hello world
3
history -S
history -M
因此,它清楚地显示了代码的输出。然而,我想看到的是代码本身,
echo
,调用
expr
等等。在bash中,
set-xv
将执行我想要的操作,但它在这里似乎不起作用


我遗漏了什么?

要确保脚本由tcsh shell运行并显示代码,只需添加以下行作为脚本的第一行:

#/bin/tcsh-v

这将使您的脚本由tcsh shell运行,并将tcsh shell设置为回显每个脚本命令

作为参考,您在问题中的实际脚本似乎不是tcsh脚本,请参阅您问题下的注释

EDIT:要在不更改脚本的情况下进行调试,您也可以简单地启动tcsh shell,并使用-v参数后跟脚本文件名:

$ /bin/tcsh -v test.tcsh

为了确保您的脚本由tcsh shell运行并显示代码,只需添加以下行作为脚本的第一行:

#/bin/tcsh-v

这将使您的脚本由tcsh shell运行,并将tcsh shell设置为回显每个脚本命令

作为参考,您在问题中的实际脚本似乎不是tcsh脚本,请参阅您问题下的注释

EDIT:要在不更改脚本的情况下进行调试,您也可以简单地启动tcsh shell,并使用-v参数后跟脚本文件名:

$ /bin/tcsh -v test.tcsh

可以为tcsh版本提供
tcsh--version
foo
bar
赋值似乎不是tcsh语法,它应该是
set foo=1
set bar=2
。在tcsh中,foobar赋值也应该是
set foobar=
expr$foo+$bar```。在我看来,您的脚本是由bash或dash shell运行的,而不是tcsh。还要注意,设置选项
verbose
echo
不是由子进程继承的,您需要在调用shell脚本时将这些命令包括在其中。当然,版本是
tcsh 6.18.01(Astron)2012-02-14(x86_64-unknown-linux)
。谢谢你-我显然继承了bash语法,忘记了如何编写tcsh脚本。你的解决方案现在可以工作了:)。@Petesh-除了在脚本中包含命令,还有其他方法吗?我希望能够轻松地更改是否从命令行进行调试,而无需每次修改文件time@Lou:您的意思是:将其传播到脚本的子进程?一个(当然不是很优雅)技巧是在每个脚本开始时测试是否设置了特定的环境变量,比如:
ECHO
,并且是否具有特定的值,比如说yes。如果是这种情况,则在tcsh中执行
set echo
,在bash中执行
set-x
。通过在
ECHO
设置为该值的脚本中运行,所有从正在运行的脚本调用的子shell(遵守此约定)都将启用跟踪。它甚至可以跨bash/csh边界工作。可以为tcsh版本提供
tcsh--version
foo
bar
赋值似乎不是tcsh语法,它应该是
set foo=1
set bar=2
。在tcsh中,foobar赋值也应该是
set foobar=
expr$foo+$bar```。在我看来,您的脚本是由bash或dash shell运行的,而不是tcsh。还要注意,设置选项
verbose
echo
不是由子进程继承的,您需要在调用shell脚本时将这些命令包括在其中。当然,版本是
tcsh 6.18.01(Astron)2012-02-14(x86_64-unknown-linux)
。谢谢你-我显然继承了bash语法,忘记了如何编写tcsh脚本。你的解决方案现在可以工作了:)。@Petesh-除了在脚本中包含命令,还有其他方法吗?我希望能够轻松地更改是否从命令行进行调试,而无需每次修改文件time@Lou:您的意思是:将其传播到脚本的子进程?一个(当然不是很优雅)技巧是在每个脚本开始时测试是否设置了特定的环境变量,比如:
ECHO
,并且是否具有特定的值,比如说yes。如果是这种情况,则在tcsh中执行
set echo
,在bash中执行
set-x
。通过在
ECHO
设置为该值的脚本中运行,所有从正在运行的脚本调用的子shell(遵守此约定)都将启用跟踪。它甚至可以跨bash/csh边界工作。谢谢,这确实有效!有没有可靠的方法可以改变调试模式而不改变shebang?我原以为这就是
set echo
set verbose
所能做的,但当我包含一个shebang
#/bin/tcsh
即使在运行这两个命令之后,它也不会产生任何调试输出。@Lou,是的。您只需从命令行执行
/bin/tcsh-v test.tcsh
。我会在答案中加上这个。太好了,谢谢你!:)谢谢,这确实有效!有没有可靠的方法可以改变调试模式而不改变shebang?我原以为这就是
set echo
set verbose
所能做的,但当我包含一个shebang
#/bin/tcsh
即使在运行这两个命令之后,它也不会产生任何调试输出。@Lou,是的。您只需从命令行执行
/bin/tcsh-v test.tcsh
。我会在答案中加上这个。太好了,谢谢你!:)