일부 포탄 (포함 bash
) :
IFS=: command eval 'p=($PATH)'
를 사용 하면 sh / POSIX 에뮬레이션에서 if를 bash
생략 할 수 있습니다 command
. 그러나 인용되지 않은 변수를 사용할 때는 일반적으로을 수행해야 set -f
하며 대부분의 셸에는 지역 범위가 없습니다.
zsh를 사용하면 다음을 수행 할 수 있습니다.
(){ local IFS=:; p=($=PATH); }
$=PATH
은 기본적으로 수행되지 않는 단어 분리를 강제로 수행하는 것입니다 zsh
(변수 확장시 글 로빙도 수행되지 않으므로 set -f
sh 에뮬레이션 이 아닌 한 필요하지 않습니다 ).
(){...}
또는 익명 함수function {...}
라고 하며 일반적으로 로컬 범위를 설정하는 데 사용됩니다. 함수에서 로컬 범위를 지원하는 다른 쉘을 사용하면 다음과 비슷한 작업을 수행 할 수 있습니다.
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
POSIX 쉘에서 변수 및 옵션에 대한 로컬 범위를 구현하기 위해 https://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh에 제공된 기능을 사용할 수도 있습니다 . 그런 다음 다음과 같이 사용할 수 있습니다.
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
( 다른 쉘 $PATH
에서 zsh
와 달리 IFS는 필드 구분자가 아니라 필드 구분 기호입니다.)
IFS=$'\n' a=($str)
같은 두 개의 과제 a=1 b=2
입니다.
에 대한 설명 var=value cmd
:
에서:
var=value cmd arg
셸은 /path/to/cmd
새 프로세스에서 실행 되어 cmd
and arg
in argv[]
및 var=value
in으로 전달 됩니다 envp[]
. 그것은 실제로 변수 할당이 아니라 실행 된 명령에 환경 변수를 전달하는 것 입니다. Bourne 또는 Korn 쉘에서을 사용하여 set -k
작성할 수도 cmd var=value arg
있습니다.
이제는 실행 되지 않는 내장 함수 나 함수에는 적용되지 않습니다 . Bourne 쉘에서 in var=value some-builtin
은 ( var
는) 나중에 var=value
혼자 와 마찬가지로 설정 됩니다. 예를 들어 var=value echo foo
(유용하지 않은) 의 동작 echo
은 내장 여부에 따라 달라집니다 .
POSIX 및 / 또는 ksh
Bourne 동작이 special builtins 라는 내장 범주에 대해서만 발생한다는 점에서 변경되었습니다 . eval
특별한 내장, read
그렇지 않습니다. 비 특수 내장의 경우, 내장 명령 의 실행에 대해서만 var=value builtin
설정 var
하여 외부 명령이 실행될 때와 유사하게 작동합니다.
이 command
명령을 사용하여 해당 특수 내장 의 특수 속성 을 제거 할 수 있습니다 . POSIX가 간과 한 것은 and 내장의 경우 쉘이 변수 스택을 구현해야한다는 것을 의미합니다 ( 또는 범위 제한 명령을 지정하지 않더라도 ).eval
.
local
typeset
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
또는:
a=1 command eval myfunction
와 myfunction
함수 인 사용 또는 설정 $a
잠재적 호출 command eval
.
때문 정말 간과했다 ksh
(사양은 대부분의 기반이되는) 그것을 구현하지 않았다 (그리고 AT & T를 ksh
하고 zsh
그것을 구현하는 두, 대부분의 껍질을 제외하고, 현재 아직도 할), 그러나. 동작은 다음과 같이 쉘마다 다릅니다.
a=0; a=1 command eval a=2; echo "$a"
그러나. local
이를 지원하는 쉘에서 사용 하는 것이 로컬 범위를 구현하는보다 안정적인 방법입니다.
IFS=: command eval …
설정IFS
합니다eval
. ksh가 홀수 비준수 one-out 인 것을 보는 것은 드문 일입니다.