【问题标题】:How can I stop sourcing a (t)csh script on a certain condition without exiting the shell?如何在不退出 shell 的情况下停止在特定条件下获取 (t)csh 脚本?
【发布时间】: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


【解决方案1】:

感谢与user shellter 的讨论,我刚刚验证了我的假设

test $ADMIN_USER = `filetest -U: $SOME_FILE` || \
  echo "Error: Admin user must own admin file" && \
    exit

实际上会退出封闭的交互式外壳。但事实并非如此。

所以我上面的问题的答案实际上是:

只需使用普通的exitsource 就会停止获取脚本,同时保持调用交互式 shell 运行。

【讨论】:

  • 所以 (t)csh 不一样?我的经验(在 ksh 和 bash 中)是任何不在子进程中的 exit 都会关闭当前的交互式 shell。 (我无权访问 (t)csh 环境)。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2014-12-10
  • 1970-01-01
  • 2020-05-16
  • 2019-05-03
  • 2011-10-13
相关资源
最近更新 更多