为什么在使用标准输入和输出的 csh 脚本中出现 "No Match" 错误?

Why am I getting a "No Match" error in csh script with standard input and output?

我正在尝试感受一下 Unix,以便我可以在 UNIX csh 中编写一个简短的程序,该程序采用标准输入和 returns 标准输出。所以我写了下面的代码:

echo "TEST"
    echo -n "Input: "
    set TEST = "$<"
    echo $TEST

但是,当我输入某些字符时,我总是收到一个我不太明白的错误。例如,

运行 1:没有问号。如您所见,它完全按照我的意愿运行。

edoras ~/As4[199]% ./scriptp1
        TEST
        Input: www.google.com/search
        www.google.com/search

运行 2:带问号。突然出现 "no match" 错误。

 edoras ~/As4[201]% ./scriptp1
    TEST
    Input: https://www.google.com/search?criteria
    echo: No match.

那么这个错误是什么,我该如何修复它?因为对于我必须编写的实际程序,我必须能够读取所有特殊字符并打印出它们的 ASCII 代码。

来自tcsh manual page:

Unless enclosed in '"' or given the ':q' modifier the results of variable substitution may eventually be command and filename substituted.

由于未引用变量,shell 尝试文件名替换,但失败了,因为您可能在名为 www.google.com 的子目录中没有匹配 search?citeria 的文件当前目录中名为 https: 的子目录。 "No match" 表示文件名替换失败。来自同一手册页:

It is an error for a glob-pattern containing '*', '?', '[' or '~', with or without '^', not to match any files.

技术解答到此结束。其余的纯粹是基于意见。

请注意,除非您有特定的充分理由,否则通常认为在 POSIX 兼容 shell 中编写脚本更可取,仅仅是因为 csh 兼容 shells 在默认情况下并不总是可用。我认为作为初学者,您真的应该首先学习在 POSIX 兼容的 shell 中编写脚本,然后才在需要时考虑 csh 兼容的 shell。

亚历克斯的回答是正确的。这 ”?”是 UNIX 中为特殊命令保留的一系列元字符之一,因此为了打印它们,我们必须跳过一些我还没有完全弄清楚的环节。但至少现在我知道为什么我会得到那个输出。

“?”是一个匹配命令,所以,就像 Alex 所说的,它试图将我的输入与不存在的东西相匹配,而不是打印出没有特殊值的纯旧文本字符。