zsh의 some_variable 및 some-variable

zsh의 some_variable 및 some-variable

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=1in var=1또는 는 명령 인수 앞에 나타나고 따옴표가 없는 유효한 변수 이름이 앞에 </dev/null var=1 cmd오기 때문에 할당으로 인식됩니다 .=

echo var=1, \var=1, var\=, 'v'ar=1, 에서 a+b=c이들은 a-b=c다양한 이유로(명령 인수 뒤, 변수 이름 뒤 또는 참조 또는 부분 참조 뒤, 잘못된 변수 이름) 할당으로 간주되지 않으므로 =일반 명령 인수로 처리되며 실행할 명령은 다음과 같이 제공됩니다. 첫 번째 주장

에서 fs-screen=1as는 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

관련 정보