鱼中的命令替换

问题描述

我正在尝试迁移此工作命令

docker-compose $(find docker-compose* | sed -e "s/^/-f /") up -d --remove-orphans

从bash到鱼。这个命令的目的是为了得到这个

docker-compose -f docker-compose.backups.yml ... -f docker-compose.wiki.yml up -d --remove-orphans

我的天真尝试

docker-compose (find docker-compose* | sed -e "s/^/-f /") up -d --remove-orphans
但是

不起作用。错误是:

ERROR: .FileNotFoundError: [Errno 2] No such file or directory: './ docker-compose.backups.yml'

正确的翻译是什么?

解决方法

行为的差异是由于fish,理智地,只在行边界上分割命令捕获的输出。而像 bash 这样的 POSIX shell 在默认情况下将其拆分为空格。也就是说,POSIX shell 会根据 $(...) 的值(默认为空格、制表符和换行符)拆分 $IFS 的输出。

有几种方法可以重写该命令,使其适用于fish。需要最小更改的是更改 sed 以在 -f 和文件名之间插入换行符:

docker-compose (find docker-compose* | sed -e "s/^/-f\n/") up -d --remove-orphans