为什么 apt-get 在安装某些东西时会消耗 stdin,而在其他情况下却不会?

Why does apt-get consume stdin when it installs something but not otherwise?

我通过 macOS 终端连接到远程 Debian 系统。

apt-get 之后的命令永远不会 运行 如果 apt-get 安装了某些东西

首先,我从我的 macOS 上的文本文件中复制这三个命令,然后使用单个 command+v[=47 将其粘贴到终端中=] 按:

sudo apt-get -y remove tree
sudo apt-get -y install tree
echo hi

这是我在终端中看到的内容。

lone@lone:~$ sudo apt-get -y remove tree
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'tree' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 17 not upgraded.
lone@lone:~$ sudo apt-get -y install tree
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  tree
0 upgraded, 1 newly installed, 0 to remove and 17 not upgraded.
Need to get 0 B/46.1 kB of archives.
After this operation, 106 kB of additional disk space will be used.
Selecting previously unselected package tree.
(Reading database ... 31853 files and directories currently installed.)
Preparing to unpack .../tree_1.7.0-5_amd64.deb ...
Unpacking tree (1.7.0-5) ...
Setting up tree (1.7.0-5) ...
Processing triggers for man-db (2.7.6.1-2) ...
lone@lone:~$ 

第三个命令 echo hi 从未执行过。为什么?

apt-get 之后的命令执行 运行 如果 apt-get 没有安装任何东西

下次,我只需将这两个命令粘贴到一个 command+v press:

sudo apt-get -y install tree
echo hi

这次,由于tree已经安装,apt-get不需要再次安装。这是我看到的输出:

lone@lone:~$ sudo apt-get -y install tree
Reading package lists... Done
Building dependency tree       
Reading state information... Done
tree is already the newest version (1.7.0-5).
0 upgraded, 0 newly installed, 0 to remove and 17 not upgraded.
lone@lone:~$ echo hi
hi

这次echo hi被执行了。为什么?

每次执行这两组操作时,这两个结果都是可重现的。为什么 echo hi 命令在第一个示例中不是 运行 而在第二个示例中是?

apt-get 或由 apt-get 调用的程序正在清空其标准输入(这恰好与 shell 相同,您的命令列表源自此处)。

因为您知道不需要从用户那里读取任何内容,所以从 /dev/null:

重定向标准输入
sudo apt-get -y remove tree </dev/null
sudo apt-get -y install tree </dev/null
echo hi