在切换到 Fish shell 之前,我经常使用zsh
with中的各种命令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
-c
csh
which
在fish
, 作为fish
的维护者已经说过, 命令替换是 with(...)
或 Also$(...)
在最近的版本中(后者可以在双引号内使用)。
与 相反zsh
,fish
没有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'
例如,这在这里是很人为的。