为什么回声?正在返回一个 |字符到标准输出

为什么回声?正在返回一个 |字符到标准输出

我试图理解这个命令的输出echo ?- 。我看到的输出是一个|字符。

答案1

因为?是 shell 的特殊通配符。 $abc 不存在,因此它被扩展为空字符串,并被?当前目录中存在的任何单字符文件或目录替换。因此,|您当前目录中可能有一个名为的文件/目录。

在我的系统上,输出是不同的:

$ echo $abc?
_ 1

如果没有单字符文件/目录,则该文件/目录?不会展开。

事实上,有目录_1.

答案2

因为?被分割成一个单词,它包含一个全局字符 ( ?),基本上表示:

打印当前目录中与 glob 匹配的文件名列表?

glob?匹配任何具有单个字符的文件。所以,这有效:

$ touch a \| b
$ echo ?
| a b
$ ls -l ?
-rw-r--r-- 1 user user 0 Dec 29 10:03 '|'
-rw-r--r-- 1 user user 0 Dec 29 10:03  a
-rw-r--r-- 1 user user 0 Dec 29 10:03  b

如果不存在包含一个字符的文件/目录,则会发生这种情况:

$ rm a \| b
$ echo ?
?

这是默认设置下 bash 的输出。
要清楚地查看文件,请执行以下操作:

$ ls -l ?
ls: cannot access '?': No such file or directory

如果nullglob激活,则不会打印任何输出

$ shopt -s nullglob
$ echo ?
$

相关内容