在切换到 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 相比不起作用吗?
fish 不使用反引号进行命令替换。相反,可以使用 parens:
file (which zsh)
or (in release 3.4.0 and later)file $(which zsh)
。这些意思是一样的。查看bash 用户的 fish 以了解其他差异。
FWIW,在 中
zsh
,您宁愿使用:或者:
file $(which zsh)
(deprecated 的现代版本file `which zsh`
)只有在没有定义别名或函数zsh
并且 zsh 命令的路径既不以换行符开头-
也不以换行符结束且不包含$IFS
(space, tab , newline 和 nul 默认)。会更正确(
which
作为, forzsh
的别名,最初是 csh 用户的 csh 脚本)。whence -c
-c
csh
which
在
fish
中,正如fish
's 的维护者已经说过的那样,命令替换是在最近的版本中(...)
或也在$(...)
最近的版本中(后者可以在双引号内使用)。相反
zsh
,fish
没有which
内置的,所以行为会随着你所在的系统而变化,这which
是一个非标准的,经常被破坏的命令。fish
有一个type
内置命令,虽然它支持一个-P
选项来强制$PATH
像 zsh's 这样的查找whence -p
。默认情况下,命令替换按换行符拆分。但是,如果使用
$(...)
内部双引号,则不会拆分,但会删除所有尾随换行符。因此
fish
,更正确的版本是:或旧版本:
(与 的不同之处
"$(...)"
在于,如果type
不产生输出(或仅产生换行符),它将不会传递任何参数file
而不是一个空参数)。¹
which zsh
要返回以换行符结尾的内容,例如,您需要这样做hash zsh=$'/path/to/some/fileendinginnewline\n\n'
,这在这里很做作。