如何将xargs与需用户输入的命令配合?apt-get管道交互需求咨询
解决apt-get通过管道接收包名时保留交互输入的问题
这个问题我之前也碰到过——当用管道把软件包名传给apt-get install时,它的标准输入被管道占了,自然没法读取你键盘的交互确认。不用-y又想保留交互的话,核心思路就是让apt-get重新从终端读取标准输入,而不是管道。
这里有两个简单可行的方案:
方案1:命令替换+终端重定向
如果你的上游命令(生成包名的命令)输出是空格分隔的合法包名,直接用命令替换把包名作为参数传给apt-get,同时强制它从终端读输入:
apt-get install $(your-package-generating-command) </dev/tty
举个实际例子,假设上游命令是echo "nginx curl",那完整命令就是:
apt-get install $(echo "nginx curl") </dev/tty
方案2:xargs配合终端重定向
如果上游命令可能输出多行包名(每行一个),用xargs处理更稳妥,同样加上终端重定向:
your-package-generating-command | xargs apt-get install </dev/tty
额外注意:处理带特殊字符的包名
如果上游命令输出的包名包含空格或其他特殊字符,建议让上游命令用null分隔输出,再搭配xargs -0参数避免解析错误:
your-package-generating-command-with-null-separated-output | xargs -0 apt-get install </dev/tty
原理说明
/dev/tty是当前进程的控制终端设备文件,把apt-get的标准输入重定向到它,就相当于强制让apt-get从你的键盘读取输入,而不是管道的输出。这样既完成了包名的传递,又保留了交互确认的能力。
内容的提问来源于stack exchange,提问作者danijar
相关产品推荐
相关产品推荐

