Antes de mudar para o shell de peixe, eu costumava usar vários comandos zsh
com which some_command
. Um exemplo pode ser:
$ 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
Quando tento fazer isso com fish
ele falha:
$ 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)
Alguma idéia de por que isso não funciona fish
em oposição a outros shells mais parecidos com o bash?
fish não usa backticks para substituições de comandos. Em vez disso, pode-se usar parênteses:
file (which zsh)
ou (na versão 3.4.0 e posterior)file $(which zsh)
. Estes significam a mesma coisa.Confira peixes para usuários do bash para outras diferenças.
FWIW, em
zsh
, você prefere usar:Ou:
file $(which zsh)
(a versão moderna do obsoletofile `which zsh`
) só funcionaria se não houvesse nenhum alias ou função também definida parazsh
e se o caminho para o comando zsh não começasse-
nem terminasse com caracteres de nova linha¹ e não contivesse caracteres de$IFS
(espaço, tabulação , newline e nul por padrão).Seria mais correto (
which
emzsh
ser um alias parawhence -c
,-c
paracsh
,which
sendo originalmente um script csh para usuários csh).Em
fish
, comofish
o mantenedor do , já disse , a substituição de comandos é com(...)
ou também$(...)
em versões recentes (esta última pode ser usada entre aspas duplas).Ao contrário de
zsh
,fish
não temwhich
built-in, então o comportamento varia de acordo com o sistema em que você está,which
sendo um comando não padrão, muitas vezes quebrado .fish
tem umtype
comando embutido que suporta uma-P
opção para forçar uma$PATH
pesquisa como zsh'swhence -p
.Por padrão, as substituições de comando são divididas em caracteres de nova linha. No entanto, se estiver usando
$(...)
aspas duplas, não haverá divisão, mas todos os caracteres de nova linha à direita serão removidos.Então, com
fish
, uma versão mais correta seria:ou com versões mais antigas:
(com uma diferença de
"$(...)"
que, setype
não produzir saída (ou apenas novas linhas), não passará nenhum argumento parafile
em vez de um argumento vazio).¹ para
which zsh
retornar algo que termine em nova linha, você precisaria ter feitohash zsh=$'/path/to/some/fileendinginnewline\n\n'
por exemplo, o que é bastante artificial aqui.