我试图理解这个命令的输出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 ?
$