鱼中的命令替换

Command substitution in fish

我正在尝试迁移这个工作命令

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 默认将它拆分为白色 space。也就是说,POSIX shell 在 $IFS 的值上拆分 $(...) 的输出,默认情况下是 space、制表符和换行符。

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

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