![zsh의 some_variable 및 some-variable](https://linux55.com/image/225158/zsh%EC%9D%98%20some_variable%20%EB%B0%8F%20some-variable.png)
왜 zsh
당신은 자신이 하고 싶은 일이 무엇인지 알고 있는 것 같으면서 some_variable=1 command
도 모르고 있습니까 some-variable=1 command
? 예: $ fs_screen=1 mpv --fs-screen=${fs_screen} someFile.mp4
잘 작동하지만 $ fs-screen=1 mpv --fs-screen=${fs-screen} someFile.mp4
결과는 다음과 같습니다.zsh: command not found: fs-screen=1
나는 zsh 문서를 파헤쳐보고 문제라고 생각되는 것을 발견했습니다. 에서 발췌https://zsh.sourceforge.io/Doc/Release/Shell-Grammar.html#Precommand-Modifiers:
A simple command may be preceded by a precommand modifier, which will alter how the command is interpreted. These modifiers are shell builtin commands with the exception of nocorrect which is a reserved word.
-
The command is executed with a ‘-’ prepended to its argv[0] string.
그러나 이에 대한 더 많은 정보는 어디에서도 찾을 수 없습니다. 그 목적은 무엇이며, some-variable
대신 사용할 수 있도록 비활성화할 수 있습니까 some_variable
?
답변1
-
zsh 변수 이름에서는 유효하지 않으며 절대 유효하지 않습니다.
${var-foo}
설정되지 않은foo
경우 확장되는 Bourne 쉘 및 POSIX의 인수 확장 연산자입니다.$var
$(( var-1 ))
Korn 쉘과 POSIX의 목적은 빼기 연산을 수행하는 것입니다.
변수 이름의 유효한 문자는 숫자와 밑줄이며 숫자로 시작할 수 없습니다.
var=1
in var=1
또는 는 명령 인수 앞에 나타나고 따옴표가 없는 유효한 변수 이름이 앞에 </dev/null var=1 cmd
오기 때문에 할당으로 인식됩니다 .=
echo var=1
, \var=1
, var\=
, 'v'ar=1
, 에서 a+b=c
이들은 a-b=c
다양한 이유로(명령 인수 뒤, 변수 이름 뒤 또는 참조 또는 부분 참조 뒤, 잘못된 변수 이름) 할당으로 간주되지 않으므로 =
일반 명령 인수로 처리되며 실행할 명령은 다음과 같이 제공됩니다. 첫 번째 주장
에서 fs-screen=1
as는 fs-screen
유효한 쉘 변수 이름이 아니므로 할당으로 인식되지 않으므로 명령 인수로 처리되며, 첫 번째 인수이므로 명령 이름으로 처리됩니다. 따라서 에 내장된 기능, 별칭, 실행 파일 목록을 살펴보고 $PATH
찾을 수 없으면 오류가 나타납니다.
다음을 사용하여 함수를 정의 할 수 있습니다 fs-screen=1
.
$ 'fs-screen=1'() echo hi
$ fs-screen=1
hi
(Bourne Supremacy) 또는:
$ function fs-screen=1 { echo hi; }
$ fs-screen=1
hi
( "코헨").
또는 별칭:
$ aliases[fs-screen=1]='echo hi'
$ fs-screen=1
hi
이라는 이름의 함수나 실행 파일을 정의할 수도 있지만 var=1
이를 호출하려면 변수 이름이나 변수 이름의 일부를 인용해야 합니다 (또는 =
실행 파일에 env
또는 와 같은 접두사를 추가하여 command
할당으로 간주됨으로 바꾸지 않도록 해야 합니다).
$ 'var=1'() echo hi
$ var=1
$ v\ar=1
hi
zsh에서 할당은 다음과 같을 수도 있습니다.
var[index]=value
문자열의 배열 요소 또는 문자에 할당됨var[first,start]=value
범위, 요소 또는 문자와 동일1=foo
동일함argv[1]=foo
: 다른 Bourne형 쉘과 달리 위치 매개변수는 변수로 처리될 수 있습니다.var=(1 2)
전체적으로 배열 또는 연관 배열 할당입니다. 새 버전에는 ksh93/bash와 호환되는assoc=( [foo]=bar )
대용량 대안 도 있습니다.assoc=( foo bar )
5.9.x 이후 zsh의 다음 버전에도 네임스페이스가 있으므로 이를 수행할 수 있습니다 a.x=foo
(그러나 그렇지 않습니다 a.b.c=foo
. ksh93에는 이미 네임스페이스와 복합 변수 및 다차원 배열이 있으며 배열 인덱스 내에 공백도 허용하므로 다음을 수행할 수 있습니다). 다음을 수행합니다 (POSIX에서 이 명령을 실행 a[1 + 1][4].x[foo].bar=13
해야 하는 경우에도 ).a[1
이제 변수 이름에는 아무런 영향이 없지만 대부분의 Unix 계열 시스템에서는 -
모든 문자와 문자가 아닌 문자(NUL 제외)도 환경 변수 이름에 나타날 수 있습니다. =
이름이 비어 있는 환경 변수를 갖는 것도 가능합니다(보통 쉽지는 않지만).
그러나 숫자나 밑줄 이외의 문자를 포함하거나 숫자로 시작하거나 zsh가 환경에서 가져오지 않는 목록에 있는 것(예: 쉘 변수에 매핑될 IFS
수 없음 ):USERNAME
$ env $'a\nb-c'=123 printenv $'a\nb-c'
123
(이것은 개행 문자가 아닌 환경 변수 이름입니다 -
.)
perl
당신이 좋아하거나 python3
접근할 수 있는 언어:
$ env $'a\nb-c'=123 perl -le 'print $ENV{"a\nb-c"}'
123
$ env $'a\nb-c'=123 python3 -c 'import os; print(os.getenv("a\nb-c"))'
123
그러나 zsh
환경 변수에 액세스하는 방식은 자체 변수에 대한 매핑을 통해 이루어지기 때문에 다른 Bourne과 유사한 쉘도 마찬가지입니다.
$ env a-b=1 a_b=2 zsh -c 'echo ${parameters[a-b]-notfound} ${parameters[a_b]-notfound}; printenv a-b'
notfound scalar-export
1
a_b
$a_b
스칼라(배열이나 연관이 아닌) 셸 변수 에 매핑되고 export
환경에서 제공되는 속성을 제공하지만 a-b
매핑되지는 않습니다. zsh는 이를 여전히 환경에 유지하므로 실행하는 명령(예: printenv
위와 같은)에 전달됩니다 . 일부 다른 쉘은 mksh
환경에서 제거하는 것을 선호합니다.
¹ 이전 요점이 아니라면 or를 인수 로 ${var-name}
사용할 수 있는 것처럼 거기에서 사용할 수 있다고 주장할 수도 있습니다 . 그렇지 않으면 산술 연산자이기도 합니다( , 물론 , ... 와 동일 ). 변수. 변수의 요점은 값을 할당할 수 있다는 것이고, 대체 할 수는 있지만 산술 표현식이 평가되기 전에 확장되기 때문에 그렇게 할 수 없습니다 .$(( $! - 1 ))
$(( ${!} - 1 ))
$!
!
$?
$*
$#
$1
$2
$(( $var ))
$(( var ))
$(( $var = 1+1 ))
$(( var = 1+1 ))
$var