IFS null이 설정되지 않은 IFS와 같지 않습니까?


13

여기서 IFS 이해 라는 큰 질문을 읽었습니다 . 답변과 의견이 POSIX를 인용하여 IFS =가 IFS 설정 해제와 동일하지 않다는 사실에 놀랐습니다. IFS를 설정 해제하면 분명히 기본값이 사용됩니다. 대신 IFS를 null로 설정하면 스플리터가 없습니다. 나는 다른 견해를 보았고 내 책갈피에서 이것을 발견했습니다.

Bourne Shell 프로그래밍

$ IFS

스크립트의 첫 번째 문장은

IFS =

입력 필드 구분자를 기본값으로 재설정합니다. 그렇지 않으면, 사용자로부터 $ IFS를 상속받습니다. 사용자는 예상 한 방식과 다르게 문자열을 구문 분석하고 이상한 동작을 유발하기 위해 기괴한 값으로 설정했을 수 있습니다.

얼마 전에 그게 사실 이었습니까 아니면 저자가 잘못 되었습니까?

답변:


20

Stack Exchange에서 찾은 답변이 맞으며이 자습서가 잘못되었습니다. 직접 실험하거나 표준 에서 찾아 볼 수 있습니다 . 설정 해제 IFS는 기본값을 space-tab-newline의 기본값으로 설정하는 것과 동일하지만 비어 있으면 IFS필드 분할이 효과적으로 해제됩니다.

히스토리 구현 에 대해서는 IFS의 Sven Mascheck 페이지를 참조하십시오 . 몇 가지 역사적인 쉘은을 좋아하지 않았으며 unset IFS매우 오래된 ksh 버전은 빈 것으로 취급 IFS했지만 모든 현대 쉘과 대부분의 오래된 쉘 IFS은 기본값과 같이 설정되지 않은 것으로 취급합니다 .

IFS=필드 분할을 해제하지 않으려면 스크립트를 시작해서는 안됩니다 (합리적인 결정이 될 수 있습니다. 그러나 그와 함께 끄지 않는 한 글로브를 피하려면 대체를 큰 따옴표로 묶어야합니다 set -f). 기본값을 재설정하려면을 사용하십시오 unset IFS. 이것이 스크립트의 시작 부분에서 유용한 지 여부는 논쟁의 여지가 있습니다. PATH발신자가 스크립트를 잘못 작성하기 위해 할 수 있는 회피와 같은 다른 나쁜 것들이 많이 있습니다.

이 튜토리얼은 또한 재설정하는 것이 좋습니다 PATH. 이것은 일반적으로 나쁜 조언입니다. 대부분의 경우 올바른 검색 경로를 예측할 수 없지만 사용자는 알고 있습니다. 당신은 어떻게 여부를 알고 /usr/local/bin/home/bob/bin에있는 사람이 어디 고대의 유닉스에 유틸리티의 버그 수정 버전을 포함 /usr/bin버그가? /usr/xpg6/bin앞서 나갈 것인지를 알아 내기 위해 모든 논리를 포함하고 싶 /bin습니까? 어떤 위치에서 원하는 /usr/gnu/bin가요? 스크립트가 특정 시스템을 대상으로하지 않는 한 PATH를 재설정하지 마십시오.

이 튜토리얼을 읽지는 않았지만 한 가지 확인했습니다. 처음부터 변수 대체와 명령 대체를 항상 큰 따옴표로 묶으라고 알려주지는 않습니다. 그래서 나는이 튜토리얼이 좋은 것이라고 생각하지 않습니다.


unset IFS필드 분할을 재설정하지만 bash에서 IFS를 기본값으로 재설정하지 않습니다.
Melab

@Melab unset IFSIFS기본값으로 재설정되지 않고 설정 을 해제합니다. 그러나 설정 해제 IFSIFS기본값 으로 설정 한 것과 동일한 효과를 갖습니다.
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.