【发布时间】:2016-03-01 02:11:35
【问题描述】:
我对“为什么 tcsh 是邪恶的”回答不感兴趣,这个问题需要 tcsh 才能使用。如果这是 tcsh 中的错误,请告诉我。
我通常很擅长引用输出,但我被一个我必须处理的用例难住了。这是简化的案例:
我有一个可以评估输出的可执行文件。有时它需要打印输出(到标准输出),所以我尝试使用 echo(内置)、/bin/echo 和 /bin/printf。
举个简单的例子,假设我的可执行文件名为“simpleWrap”,它输出:
echo "hello world"
所以我运行(最终使用别名,但这无关紧要):
eval `simpleWrap`
正如预期的那样,我得到了:
hello world
但这就是问题所在。有时我需要在输出中添加波浪号。所以让我们尝试一些例子。我们将把波浪线放在 simpleWrap 输出中(这不是脚本的内容,而是它输出的内容):
echo "These are tildes: ~ and \~ and \\~"
令人惊讶的是,当我现在评估 simpleWrap 的输出时,我得到:
These are tildes: /home/dave and \~ and \~
要么 ~ 扩展至我的主目录,要么 \ 保护它,但我无法摆脱反斜杠。
如何在带有反引号的 eval 的输出中打印一个“~”?
我相信反引号会迫使 ~ 扩展,但它们并没有以一致的方式进行。例如,如果我跳过反引号并执行以下操作:
eval echo "These are tildes: ~ and \~ and \\~"
然后我得到一个一致的、预期的输出:
These are tildes: /home/dave and ~ and \~
反引号中的替换有什么问题,还是我错过了正确的引用可能性? (我也试过用单引号和双引号括起来无济于事)
【问题讨论】:
-
我不明白你的例子或你想要做什么。
eval `simpleWrap`不会产生“Hello world”;反引号产生“Hello world”,eval尝试运行命令Hello world。话虽如此,一般来说,我更喜欢使用set noglob来解决这个问题(然后稍后使用set glob重新启用它)。 -
请再读一遍解释 - simpleWrap outputs 'echo "hello world"',它不只是 echo hello world。
-
为了避免这样的混淆,这就是为什么总是推荐Minimal, Complete, and Verifiable example ;-)
-
虽然我在语言方面没有经验,但我只是投入了两分钱。也许尝试输出一个 unicode
U+007E?