필요에 따라 IFS를 저장하고 할당 할 수 있습니다. 그렇게하는 데 아무런 문제가 없습니다. 배열 할당 예와 같이 일시적이고 신속하게 수정 한 후 복원 할 값을 저장하는 것은 드문 일이 아닙니다.
@llua가 귀하의 질문에 대한 언급에서 언급했듯이 IFS를 설정 해제하면 스페이스 탭 줄 바꿈을 지정하는 것과 동일한 기본 동작이 복원됩니다.
IFS를 명시 적으로 설정 / 설정 해제 하지 않는 것이 더 문제가 될 수있는 방법을 고려해 볼 가치가 있습니다 .
POSIX 2013 버전 2.5.3 쉘 변수에서 :
쉘을 호출 할 때 환경에서 IFS의 값 또는 환경에서 IFS가없는 경우 구현시 쉘이 IFS를 <space> <tab> <newline>으로 설정해야합니다. .
POSIX 호환 호출 쉘은 해당 환경에서 IFS를 상속하거나 상속하지 않을 수 있습니다. 이것부터 :
- 이식 가능한 스크립트는 환경을 통해 IFS를 확실하게 상속 할 수 없습니다.
"$*"
환경에서 IFS를 초기화하는 셸에서 실행될 수 있지만 기본 분할 동작 (또는 경우 조인) 만 사용하려는 스크립트는 환경 침입으로부터 자체적으로 방어하기 위해 IFS를 명시 적으로 설정 / 설정 해제해야합니다.
NB이 토론에서 "부르다"라는 단어에는 특별한 의미가 있음을 이해하는 것이 중요합니다. 쉘은 이름 ( #!/path/to/shell
shebang 포함)을 사용하여 명시 적으로 호출 된 경우에만 호출됩니다 . $(...)
또는에 의해 생성 될 수있는 서브 쉘 cmd1 || cmd2 &
은 호출 된 쉘이 아니며 IFS (대부분의 실행 환경과 함께)는 부모의 쉘과 동일합니다. 호출 된 쉘은 값을 $
pid로 설정하고 서브 쉘은이를 상속합니다.
이것은 단지 단순한 청각이 아니다. 이 영역에는 실제로 차이가 있습니다. 다음은 몇 가지 다른 셸을 사용하여 시나리오를 테스트하는 간단한 스크립트입니다. 수정 된 IFS (로 설정 됨 :
)를 호출 된 쉘로 내 보낸 다음 기본 IFS를 인쇄합니다.
$ cat export-IFS.sh
export IFS=:
for sh in bash ksh93 mksh dash busybox:sh; do
printf '\n%s\n' "$sh"
$sh -c 'printf %s "$IFS"' | hexdump -C
done
IFS는 일반적으로 내보내기로 표시되지 않지만, bash, ksh93 및 mksh가 환경을 무시하는 방법에 주목 IFS=:
하고 dash 및 busybox는이를 존중합니다.
$ sh export-IFS.sh
bash
00000000 20 09 0a | ..|
00000003
ksh93
00000000 20 09 0a | ..|
00000003
mksh
00000000 20 09 0a | ..|
00000003
dash
00000000 3a |:|
00000001
busybox:sh
00000000 3a |:|
00000001
일부 버전 정보 :
bash: GNU bash, version 4.3.11(1)-release
ksh93: sh (AT&T Research) 93u+ 2012-08-01
mksh: KSH_VERSION='@(#)MIRBSD KSH R46 2013/05/02'
dash: 0.5.7
busybox: BusyBox v1.21.1
bash, ksh93 및 mksh가 환경에서 IFS를 초기화하지 않더라도 수정 된 IFS를 다시 내 보냅니다.
어떤 이유로 든 환경을 통해 IFS를 이식 가능하게 전달해야하는 경우 IFS 자체를 사용하여 수행 할 수 없습니다. 값을 다른 변수에 지정하고 해당 변수를 내보내도록 표시해야합니다. 그런 다음 어린이는 해당 값을 IFS에 명시 적으로 할당해야합니다.