【发布时间】:2012-05-17 18:03:46
【问题描述】:
我必须获取一个 tcsh 脚本来修改环境变量。
需要进行一些测试,如果有任何测试失败,采购将停止而不退出外壳。我不想将脚本作为子进程运行,因为我需要在父进程中修改子进程无法执行的环境变量。这与this question 相似但不同,作者实际上可以将脚本作为子进程运行。
通常的解决方法是创建一个别名,该别名运行一个脚本 (csh/bash/perl/python/...),该脚本编写一个包含所有 env var 设置的临时文件,并在最后源并删除该临时文件。 Here's more info for those interested (demoing a solution for bash)。对于我非常简单和简短的东西,我不需要额外的别名。
所以我的解决方法是引发语法错误,从而停止任何source 的执行。这是一个例子:
test $ADMIN_USER = `filetest -U: $SOME_FILE` || "Error: Admin user must own admin file"
短路|| 导致错误文本被忽略,以防万一。在测试失败时,错误文本被解释为命令,未找到,源停止并产生合理的错误消息:
Error: Admin user must own admin file: Command not found.
有没有更好的方法来做到这一点?我忽略了一些内置的 csh/tcsh?
【问题讨论】:
-
为什么不只是围绕条件变量的条件块,即
if ( `filetest -U: $SOMEFILE` ) ; then set vars ; else set ohter vars endif。抱歉,我的 (t)csh 语法相当生疏,所以我不确定是否需要( parens )。祝你好运。 -
问题不在于
source内部的控制流。问题在于停止获取脚本而不退出其来源的外壳。如果我要为测试创建一个if条件,else将跨越到文件的末尾。对于十个左右的测试(嵌套!),这很笨拙。 - 除非我可以将所有测试结合到一个(或几个)位置,否则我不确定我是否想要这样做。 -
仔细想想,这个问题在bash脚本中也是一样的,不是吗?
-
是的,在大多数 shell 中都会出现同样的问题。我很惊讶您的
...|| "Error: Admin..."thingy 停止了文件的来源,同时让周围的脚本继续。我本来希望它报告错误并继续源文件的下一行。这可能是 (t)csh 的特征列中的一个!祝你好运。 -
“周围的脚本”只是交互式外壳。这就是为什么我不能使用简单的
exit命令。如果源脚本执行exit将退出交互式 shell
标签: syntax-error exit csh tcsh