我想要做的是:每当命令apt-get install
运行并终止时,立即运行另一个命令,而无需用户参与。就我而言,我想运行一个脚本,但由于我可以用命令代替它,因此最好使用命令作为示例。
顺便说一句,我不想运行执行两个命令的脚本,因为必须手动执行它,这不是我想要的。命令的终止apt-get install
必须提示执行另一个命令。
笔记:这看起来像是这问题,虽然我确实有答案,但我想清楚地表达我的意图,以防有其他可能的解决方案,同时也向其他潜在的观众阐明我的要求。
编辑:
澄清:我正在尝试获取一个运行两个的命令!
为什么?我想生成一个文件,其中包含我的发行版上所有已安装的依赖项和软件的列表,该文件每次apt-get install
使用命令时都会更新。
答案1
困难的部分是正确解析参数。您可以apt-get install pkgname
轻松处理简单的情况,但是一旦您想要处理apt-get -y install pkgname
附加情况,您就会突然需要一个功能齐全的选项解析器。
假设简单的情况已经足够了,类似这样的包装脚本就足够了:
#!/bin/bash
/usr/bin/apt-get "$@"
status=$?
if [[ $1 = install ]]; then
read -rp 'Run this other thing too [Y/n]? ' ans
if [[ ${ans:-y} = [Yy] ]]; then
other-thing
exit # exit with other-thing's exit status.
fi
fi
exit "$status" # exit with apt-get's exit status.
答案2
有几种方法,取决于您的意图。
可以使用;
分隔符来顺序执行。它将按顺序执行,每个命令都会运行,而不管前一个命令的退出状态如何。例如:
echo hello; printf "\n\n%s" WORLD
条件执行可以通过布尔运算符||
和来完成&&
。有了这些,第二个程序的执行取决于第一个程序的退出状态(第一个和第二个从左到右读取)。
因为&&
行为如下:COMMAND1 && COMMAND2
,如果COMMAND1
成功终止,COMMAND2
将运行。您可以将其记为“如果左成功,则右将运行;如果左失败,则右将不会运行” [ -f /etc/passwd ] && echo "/etc/passwd 存在"
因为||
它的反义词是“如果左派成功,右派就不会跑;如果左派失败,右派就会跑”
[ -d /etc/passwd ] || echo "/etc/passwd is not a directory"
要将这些放入一个命令中,有几个选项。一个显然是脚本,但正如您所要求的,您不需要脚本。另一种方法是bash 函数或者别名。
我们优先选择 Bash 函数,因为如果您愿意的话,可以向它们传递参数。
在您的具体情况下,您需要apt-get install
可能需要多个参数
function installStuff
{
apt-get install "$@"
command2
}
将其放入你的.bashrc
顶部某处,关闭.bashrc
并运行source .bashrc
。现在你有一个 bash 函数,它总是apt-get install
首先运行,请求任意数量的包,然后立即command2
就像这样
installStuff package1 package2 package3
对于 command2 的条件运行,请使用我已经提到的&&
和运算符。||