如何在不展开shell的情况下捕获程序的输出?

时间:2014-08-14 18:58:29

标签: shell tcsh

考虑以下两个tcsh脚本。

SCRIPT1:

setenv MYVAR `echo "str"

SCRIPT2:

setenv MYVAR `echo "str*"`

第一个完成没有错误。第二个得到了#34;没有匹配"错误,因为shell无法找到匹配" str *"的任何文件。如何在这种情况下避免错误,以便MVAR的内容为" str *"?

请注意,我可以在这里消除反引号和回声。这是一个问题的抽象,我试图在另一个无法轻易删除的环境中进行调试。

2 个答案:

答案 0 :(得分:0)

你必须引用反引号。这比听起来更难,因为tcsh不会让你嵌套双引号。

您可以重写查询,使其适合双引号:

setenv MYVAR "`echo "\""str*"\""`"

或利用多种类型的报价:

setenv MYVAR "`echo 'str*'`"

或遵循twalberg的建议并使用更好的外壳。

答案 1 :(得分:0)

在tcsh中,你经常想要在双引号("...")内执行“特殊”操作(反引号,变量替换等)(但不是单引号,这会禁用大多数神奇的。)

在您的情况下,您需要在变量赋值和变量替换中使用双引号。

% setenv AA "`echo 'str*'`"
% echo "$AA"
str*

在第一行中,我们通过使用单引号来避免* - 扩展。我们也可以使用反斜杠*来逃避\(如@ twalberg的答案)并删除单引号。 (一般来说,我们也可以使用双引号,但在这种情况下,它们会与外部双引号发生冲突)。

然后,正如我已经说过的,我们在setenv表达式周围使用双引号,在第二行中使用变量替换。


是的,社会希望你认为你是使用tcsh的可怕人类。这只是社会喜欢做的事情之一。