기본 아이디어는 when 가 외부 명령 일 때 실행 하도록 VAR=VALUE some-command설정 VAR되어 VALUE있으며, 그보다 더 화려하지는 않습니다. 이 직관을 쉘 작동 방식에 대한 지식과 결합하면 대부분의 경우 정답을 제시해야합니다. POSIX 참조는 “Shell Command Language”장의“Simple Commands”입니다 .some-commandsome-command
경우 some-command입니다 외부 명령 , VAR=VALUE some-command동일합니다 env VAR=VALUE some-command. VAR의 환경에서 내보내지고 some-command셸의 값 (또는 값이 없음)은 변경되지 않습니다.
경우 some-commandA는 함수가 다음 VAR=VALUE some-command에 해당합니다 VAR=VALUE; some-command, 즉 장소에 할당 남아 함수 후가 돌아왔다, 그리고 변수는 환경에 내보낼 수 없습니다. 그 이유는 Bourne 쉘의 디자인과 관련이 있으며 그 이후에는 이전 버전과의 호환성과 관련이 있습니다. 함수 실행 주위에 변수 값을 저장하고 복원하는 기능이 없었습니다. 함수는 셸 자체에서 실행되므로 변수를 내 보내지 않는 것이 좋습니다. 그러나 ksh (ATT ksh93 및 pdksh / mksh 모두 포함), bash 및 zsh VAR는 함수 실행 중에 만 설정되는 (내 보낸) 보다 유용한 동작을 구현합니다 . 에서는 KSH 함수가 KSH 구문으로 정의되는 경우,이 이루어진다function NAME …표준 구문으로 정의 된 경우가 아닙니다 NAME (). 에서 bash는 (함께 실행할 때이되지 POSIX 모드에서 만 떠들썩한 파티 모드에서 이루어집니다 POSIXLY_CORRECT=1). zsh 에서는 posix_builtins옵션이 설정되지 않은 경우 수행됩니다 . 이 옵션은 기본적으로 설정되어 있지 않지만 emulate sh또는 로 설정되어 emulate ksh있습니다.
경우 some-command내장 명령이 동작은 내장의 유형에 따라 달라집니다. 특수 내장 기능처럼 작동합니다. 특수 내장 기능은 상태 쉘에 영향을 미치기 때문에 쉘 내부에 구현되어야하는 것들입니다 (예 : break제어 흐름, cd현재 디렉토리, set위치 매개 변수 및 옵션에 영향을 미칩니다). 다른 내장 기능 은 성능과 편의성을 위해 내장 되어 있으며 (예 : bash 기능 printf -v은 내장 기능으로 만 구현할 수 있음) 외부 명령처럼 동작합니다.
할당은 경우에, 그래서 별칭 확장 후 발생 some-command입니다 별칭 , 무슨 찾기 위해 먼저 확장합니다.
모든 경우에 명령 행 자체에 대한 변수 대체를 포함하여 명령 행을 구문 분석 한 후에 지정이 수행됩니다. 그래서 var=a; var=b echo $var인쇄 a때문에 $var할당이 일어나기 전에 평가된다. 따라서 IFS=. printf "%s\n" $var이전 IFS값을 사용하여 분할 $var합니다.
모든 유형의 명령을 다루었지만 한 가지 더 있습니다. 실행할 명령이없는 경우, 즉 명령이 할당 (및 가능한 재 지정)으로 만 구성된 경우입니다. 이 경우 과제는 그대로 유지됩니다 . VAR=VALUE OTHERVAR=OTHERVALUE와 같습니다 VAR=VALUE; OTHERVAR=OTHERVALUE. 따라서 이후 IFS=. arr=($var)로 IFS설정된 상태로 유지됩니다 .. $IFS과제에 arr이미 새로운 가치가 있다고 기대할 수 있기 때문에 의 새로운 가치 IFS가의 확장에 사용 된다는 것이 합리적 입니다 $var.
요약하면, 당신은 사용할 수 있습니다 IFS에 대한 일시적 전용 필드 분할 :
- 새로운 쉘 또는 서브 쉘을 시작함으로써 (예를 들어 , 값 이 2 자 미만인 경우 다르게 행동
third=$(IFS=.; set -f; set -- $var; echo "$3")하는 third=${var#*.*.}것을 제외하고 는 복잡한 방법이다 );var.
- ksh에서,
IFS=. some-function여기서 some-functionksh 구문으로 정의됩니다 function some-function ….
IFS=. some-function호환성 모드가 아닌 기본 모드에서 작동 하는 한 bash 및 zsh에서 .
IFS는."Eek. 첫 번째 부분을 읽은 후에는 의미가 있지만이 Q를 게시하기 전에는 예상하지 못했습니다.