如何将命令参数链接到特定的命令二进制文件

如何将命令参数链接到特定的命令二进制文件

我对将命令链接到一个特定的二进制文件有一般性疑问狂欢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

相关内容