Fish shell:为什么 `file `which command`` 在 zsh 和 bash 中工作,但在 Fish 中不起作用?

Fish shell:为什么 `file `which command`` 在 zsh 和 bash 中工作,但在 Fish 中不起作用?

在切换到 Fish shell 之前,我经常使用zshwith中的各种命令which some_command。一个例子可能是:

$ file `which zsh`
/opt/local/bin/zsh: Mach-O 64-bit executable arm64
/bin/zsh:           Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e
- Mach-O 64-bit executable arm64e]
/bin/zsh (for architecture x86_64): Mach-O 64-bit executable x86_64
/bin/zsh (for architecture arm64e): Mach-O 64-bit executable arm64e

当我尝试这样做时fish失败了:

$ which zsh
/opt/local/bin/zsh

$ file `which zsh`
`which: cannot open ``which' (No such file or directory)
zsh`:   cannot open `zsh`' (No such file or directory)

fish知道为什么这与其他更像 bash 的 shell 相比不起作用吗?

答案1

Fish 不使用反引号进行命令替换。相反,可以使用 parens:file (which zsh)或(在版本 3.4.0 及更高版本中)file $(which zsh)。这些意思是一样的。

查看为 bash 用户钓鱼对于其他差异。

答案2

FWIW,在 中zsh,您宁愿使用:

file -- =zsh

或者:

() {file -- $1:c} zsh

file $(which zsh)(已弃用的现代版本file `which zsh`)仅在没有定义别名或函数zsh且 zsh 命令的路径不以-换行符开头或结尾的情况下才有效,并且不包含$IFS(空格、制表符) ,默认换行符和nul)。

file -- "$(whence -p zsh)"

会更正确(which作为, for 的zsh别名,最初是 csh 用户的 csh 脚本)。whence -c-ccshwhich

fish, 作为fish的维护者已经说过, 命令替换是 with(...)或 Also$(...)在最近的版本中(后者可以在双引号内使用)。

与 相反zshfish没有which内置功能,因此行为会根据您所在的系统而有所不同,which是一个非标准的、经常被破坏的命令

fish有一个type内置命令,但它支持-P强制$PATH查找的选项,如 zsh 的whence -p.

默认情况下,命令替换按换行符分割。但是,如果使用$(...)内部双引号,则不会进行拆分,但所有尾随换行符都会被删除。

因此,对于fish,更正确的版本是:

file -- "$(type -P zsh)"

或使用旧版本:

file -- (type -P zsh | string collect)

(与 if 的一个区别是"$(...)"iftype不产生输出(或仅产生换行符),它不会传递任何参数file而不是一个空参数)。


1 要which zsh返回以换行符结尾的内容,您需要完成hash zsh=$'/path/to/some/fileendinginnewline\n\n'例如,这在这里是很人为的。

相关内容