我对将命令链接到一个特定的二进制文件有一般性疑问狂欢shell,来自 Magento 的示例(用例)
在 Magento 中,您通常希望将多个命令链接在一起 - 它们会花费很长时间,因此为了批量运行,您可以执行以下操作:
bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush
最初,我将这些命令链添加到~/.bash_aliases
,但获得一致的命令组并不像我想象的那么容易。
我已将二进制文件添加到我的 PATH 中,但我想知道您是否可以链接命令,以便它看起来像这样:
mag_chain setup:upgrade setup:di:compile cache:flush
这可能吗?
如果没有的话,是否有一个使用 bash 的解决方案可以给我指明正确的方向?
答案1
bash 没有内置方法来执行此操作,但您可以毫不费力地编写脚本。主要的棘手之处在于能够找出一个命令在哪里结束,下一个命令在哪里开始。我不了解 magneto,所以这是一个难以置信的例子,但假设您要运行
mag_chain help setup:upgrade
...应该这样做magento help && magento setup:upgrade
,还是只是magento help setup:upgrade
?一种可能性是使用引号将每个单独的命令作为单个参数传递:
mag_chain help setup:upgrade # -> magento help && magento setup:upgrade
mag_chain "help setup:upgrade" # -> magento help setup:upgrade
拆分单个命令的参数有点混乱。bash 有一个内置的方法来做到这一点,即使用不带双引号的参数,但在某些情况下这会带来奇怪的问题;xargs
做得更合理拆分单词,所以使用它。
还有一些其他需要担心的事情:确保检查每个步骤是否有错误,如果有错误,则取消其余的链。另外,我不确定实际magneto
命令本身应该是什么。你使用了bin/magneto
,但这假设magneto
文件是直接可执行的(即你不需要php bin/magneto
),和它位于当前工作目录下的“bin”目录中。因此我将 magneto 命令放在数组中,以便于更改。
#!/bin/bash
magneto_command=(bin/magneto)
if [[ $# -eq 0 ]]; then
echo "Usage: $0 magneto_command [magneto_command...]" >&2
exit 1
fi
for subcommand in "$@"; do
xargs -o "${magneto_command[@]}" <<<"$subcommand" || {
status=$?
echo "Remainder of chain cancelled" >&2
exit $status
}
done