运行 命令的模式扩展
Pattern expansion to run commands
知道我能够 运行 echo
或 mv
来扩展像这样的模式:echo {0..9}{A..Z}
。我很想知道除了 运行 命令之外是否还有其他方法可以做到这一点?
docker-compose {stop,rm,up -d}
上面的例子不起作用,但是有一些方法可以做到这一点(运行 停止,rm 和 up 分开)?
不是你说的那样。
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
您可以使用 eval
:
eval docker-compose\ {stop,rm,'up -d'}\;
但是需要小心escaping/quoting。只需使用 echo
而不是 docker
来测试它是否发出正确的命令:
$ echo docker-compose\ {stop,rm,'up -d'}\;
docker-compose stop; docker-compose rm; docker-compose up -d;
知道我能够 运行 echo
或 mv
来扩展像这样的模式:echo {0..9}{A..Z}
。我很想知道除了 运行 命令之外是否还有其他方法可以做到这一点?
docker-compose {stop,rm,up -d}
上面的例子不起作用,但是有一些方法可以做到这一点(运行 停止,rm 和 up 分开)?
不是你说的那样。
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
您可以使用 eval
:
eval docker-compose\ {stop,rm,'up -d'}\;
但是需要小心escaping/quoting。只需使用 echo
而不是 docker
来测试它是否发出正确的命令:
$ echo docker-compose\ {stop,rm,'up -d'}\;
docker-compose stop; docker-compose rm; docker-compose up -d;