模式扩展以运行命令

时间:2015-11-16 10:44:54

标签: bash brace-expansion

知道我能够运行echomv来扩展这些模式:echo {0..9}{A..Z}。我很想知道是否有办法做同样的事情但是要运行命令?

docker-compose {stop,rm,up -d}

上面的示例不起作用,但有一些方法可以实现(分别运行stop,rm和up)?

2 个答案:

答案 0 :(得分:5)

不是你提到它的方式。

Brace expansion在任何其他扩展之前发生。这意味着,当您说echo {0,1}{a,b}时,Bash会在执行任何其他步骤之前扩展大括号。这样,它就变成echo 0a 0b 1a 1b一个命令

当你提到docker-compose {stop,rm,up -d}时,请注意这会扩展为一个命令:docker-compose stop rm up -d,它似乎无效。

您似乎想要运行三个不同的命令

docker-compose stop
docker-compose rm
docker-compose up -d

为此,您可能想要使用循环(注意" up -d"被引用以便将其视为单个参数):

for argument in stop rm "up -d"
do
    docker-compose $argument
done

答案 1 :(得分:2)

您可以使用eval

eval docker-compose\ {stop,rm,'up -d'}\;

但需要小心逃避/引用。只需使用echo而不是docker进行测试即可发出正确的命令:

$ echo docker-compose\ {stop,rm,'up -d'}\;
docker-compose stop; docker-compose rm; docker-compose up -d;