我正在编写一个脚本,需要读取一个文件,其中包含我为其编写此行的包的信息
apt show $PACKAGE_NAME > pack_info.txt
但是,这不会创建pack_info.txt
文件并且总是给出此警告:
警告:apt 没有稳定的 CLI 界面。在脚本中请谨慎使用。
暂时我尝试重定向STDOUT
和STDERR
使用&>
,结果提供了pack_info.txt
我们需要的文件。
我也尝试从中获取内容dpkg
,并且也有效:
dpkg -s $PACKAGE_NAME > pack_info.txt
好处是它既不显示警告也不显示错误。
糟糕的是,我们不想使用 dpkg,而只想将 apt 的 STDOUT 重定向到文件。
因此,我有三个问题要问:
- 我们所说的稳定的 CLI 接口到底是什么意思?
- 如何在脚本中安全且无错误地使用此类命令?[请举例说明]
- 有没有办法只将 STDOUT 重定向
apt show
到文件?
答案1
apt
用于终端,输出漂亮的输出;而apt-get
和apt-cache
用于脚本,输出稳定、可解析的输出。因此,您的命令的脚本等价apt show
于:
apt-cache show $PACKAGE_NAME >pack_info.txt
现在逐一回答你的问题:
我们所说的稳定 CLI 接口到底是什么意思?
apt
的输出在脚本中不太好用。例如,apt install
(与 相比apt-get install
)显示进度条,这对脚本毫无用处,并且在解析输出时可能会抛出错误。apt show firefox
显示附加记录的提示,这在脚本中也完全没用,您希望它只是输出每一个记录在那里——这就是它的apt-cache show firefox
作用。让我们看看man apt
对此有什么看法:
这易于(8) 命令行被设计为最终用户工具,其行为可能会因版本不同而有所变化。虽然它试图不破坏向后兼容性,但如果更改似乎有利于交互使用,则也无法保证这一点。
所有功能易于(8)有专门的 APT 工具可用,例如apt-get(8)以及apt-缓存(8)同样。 易于(8)只是改变了一些选项的默认值(见apt.conf(5)特别是二进制范围)。因此,您应该优先在脚本中使用这些命令(可能启用一些附加选项),因为它们尽可能保持向后兼容性。
如何在脚本中安全且无错误地使用这些命令?
只需分别使用apt-get
或apt-cache
代替普通的apt
。:) 参见这个答案获得等价物列表。
有没有办法只将 apt show 的 STDOUT 重定向到一个文件?
您已经正确地完成了操作:>file
或者1>file
重定向 stdout、2>file
重定向 stderr 以及&>file
将两者都重定向到file
。