我在使用 Ubuntu 18.04 中的 zsh 或 bash 列出使用 apt 的软件包时遇到了问题。
场景如下:
过去,我可以使用 列出系统上的所有软件包apt list *
,或者使用 列出这些软件包的子集apt list *partial-name*
,等等。但是,现在如果我这样做,它将什么都不显示。apt list
仅当我明确写出软件包的名称时才会显示软件包。即,如果我要查找build-essential
,然后输入apt list build-essen*
,则不会有任何列出的输出。但是,如果我输入apt list build-essential
,它将仅显示一个软件包(如预期的那样)。
如果有人对如何解决这个问题有任何建议,我们将不胜感激,谢谢!
答案1
许多 shell(如 bash 或 zsh)不只是将输入通过管道传输到被调用的程序。相反,会执行一些扩展和替换。举个例子,bash 执行八种不同的扩展。
例如,让我们看看类似 的内容ls my_fi*.txt
。使用此命令,bash 将执行所谓的“路径名扩展”。如果my_file.txt
当前目录中有一个名为的文件,则 shell 会将命令扩展为ls my_file.txt
。ls
程序永远不会看到my_fi*.txt
参数,它只会获取扩展版本。
因此,当您输入 时apt list *
,*
将被替换为您当前目录中的文件列表,这就是apt list
输入的内容。您基本上是通过您不打算使用的参数来过滤包列表。
为了防止 bash(我相信 zsh 的工作原理类似)进行所有扩展和替换,您可以屏蔽“触发”该过程的特殊字符。这样,它们就会被apt list
不加改变地移交给(或您调用的任何程序)。
要屏蔽某个字符,可以在其前面加上反斜杠
apt list \*
或者你可以把整个论点放在引号里
apt list '*'
您可能需要注意,第一种方法适用于一个字符
apt list my_packa\*
第二种方法适用于整个论证
apt list "my_packa*"