如何在 fish shell 中进行命令替换?

如何在 fish shell 中进行命令替换?

像这样的 Bash(或其他 POSIX shell)命令在 fish 中该如何表达?

ls -l $(which vim) # or
ls -l `which vim`

答案1

在 中fish$仅用于变量扩展。$从命令中省略 即可。例如:

ls -l (which vim)

您可能还想参考文档:命令替换

答案2

从 Fish 版本 3.4.0 开始,命令替换现在可以使用任何一个 $()()分组。例如:

ls -l $(which vim) # or
ls -l (which vim)

对于 3.4.0 之前的版本,仅表格()可用。

反引号在 Bash 和其他 POSIX shell 中有效,但不能用作命令替换运算符。一般来说,反引号不再受到推崇的在任何 shell 中都可以实现此目的,但有些习惯(和旧文档)很难打破。

答案3

有时需要string split在里面使用(),否则-lgio-2.0 -lgobject-2.0 -lglib-2.0编译器会错误地解释为“去查找名为的库gio-2.0 -lgobject-2.0 -lglib-2.0,其中空格是其名称的一部分”。

引用官方教程

与其他 shell 不同,fish 不会根据任何空格(如空格或制表符)拆分命令替换,只会根据换行符拆分。对于pkg-config打印一行中多个参数的命令,这可能会造成问题。如果也要根据空格拆分,请使用string split

> printf '%s\n' (pkg-config --libs gio-2.0)
-lgio-2.0 -lgobject-2.0 -lglib-2.0
> printf '%s\n' (pkg-config --libs gio-2.0 | string split " ")
-lgio-2.0
-lgobject-2.0
-lglib-2.0 ```

相关内容