zsh
Fish Shell로 전환하기 전에는 에서 다양한 명령을 자주 사용했습니다 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와 유사한 다른 쉘에 비해 이것이 작동하지 않는 이유는 무엇입니까?
답변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)
(더 이상 사용되지 않는 최신 버전 ) 별칭이나 함수가 정의되지 않고 zsh 명령에 대한 경로가 줄 바꿈으로 시작하거나 끝나지 않고 (공백, 탭, 기본 줄 바꿈 및 nul)을 포함하지 않는 file `which zsh`
경우에만 유효합니다 .zsh
-
$IFS
file -- "$(whence -p zsh)"
더 정확할 것입니다 ( 원래는 csh 사용자를 위한 csh 스크립트 which
의 별칭으로 ).zsh
whence -c
-c
csh
which
에서는 다음 fish
과 같이fish
관리자는, 명령 대체는 (...)
또는 $(...)
최신 버전에서도 가능합니다(후자는 큰따옴표 안에 사용할 수 있음).
대조적으로 zsh
, 내장된 기능이 fish
없으므로 which
사용 중인 시스템에 따라 동작이 달라집니다.which
비표준이며 종종 깨진 명령입니다..
fish
type
내장 명령이 있지만 zsh와 같이 -P
강제로 조회하는 옵션을 지원합니다 .$PATH
whence -p
기본적으로 명령 대체는 줄바꿈으로 구분됩니다. 그러나 내부 큰따옴표를 사용하면 $(...)
분할이 발생하지 않지만 후행 줄 바꿈은 제거됩니다.
따라서 의 경우 fish
더 정확한 버전은 다음과 같습니다.
file -- "$(type -P zsh)"
또는 이전 버전을 사용하세요.
file -- (type -P zsh | string collect)
(if와의 한 가지 차이점은 "$(...)"
if가 type
출력을 생성하지 않거나 개행 문자만 생성하면 file
빈 매개변수 대신 매개변수를 전달하지 않는다는 것입니다.)
1 which zsh
개행으로 끝나는 것을 반환 하려면 hash zsh=$'/path/to/some/fileendinginnewline\n\n'
예를 들어 여기서는 상당히 인위적인 작업을 수행해야 합니다.