我设置了一个管道,返回我想安装的包的名称apt-get
:
... | xargs -I _ sudo apt install _
但是,apt-get
在这种情况下无法从标准输入读取并退出:
你想继续吗?[是/否] 中止。
我知道在-y
没有用户确认的情况下安装包的标志,但我想真正看到确认。
有没有办法将包名转发到apt-get
同时仍然允许它从标准输入读取?
放在整个命令的左侧不是一个选项,因为如果使用该选项中止管道中的 ealier 命令,apt-get
我不想被执行。apt-get
set -o pipefail
使用 GNU 实现
xargs
(通常在也有apt
命令的系统上找到)和支持进程替换的 shell(如 ksh93/zsh/bash),您可以执行以下操作:代替:
apt
请注意,一次将所有包传递给而不是每个包调用一个可能更有意义apt
。(
-d
作为另一个 GNU 扩展)在任何情况下,例如在管道版本中,无论是否成功
pipefail
,它都会运行,因为它会同时启动并同时运行。sudo
cmd
sudo
cmd
pipefail
不会阻止管道的右侧运行,整个管道像往常一样同时运行。试试例如如果没有输入,它的使用
xargs
可能会或可能不会阻止在这里运行。apt
没有-r
或-I
它仍然会至少运行一次命令。但是您可以通过使用命令替换捕获输出然后
apt
根据结果运行或不运行来解决此问题:包名不应该有任何空格,所以使用
$packages
unquoted 应该可以工作(假设默认值$IFS
; 他们可能也不能包含 glob 字符,所以set -f
可能是不必要的)。