나는 여기에서 다음과 같은 훌륭한 질문을 읽었습니다.IFS에 대해 알아보기. 답변과 의견이 IFS=가 IFS 설정 해제와 동일하지 않다는 POSIX를 참조하기 때문에 놀랐습니다. IFS가 설정되지 않으면 당연히 기본값이 사용됩니다. IFS가 비어 있는 경우 분할자가 없습니다. 나는 이것에 대해 다른 의견을 가지고 있다는 것을 알고 있습니다. 내 북마크에서 다음을 발견했습니다.
$IFS
스크립트의 첫 번째 문은 다음과 같아야 합니다.
IFS=
입력 필드 구분 기호를 기본값으로 재설정합니다. 그렇지 않으면 사용자로부터 $IFS를 상속받게 됩니다. 사용자는 이를 이상한 값으로 설정하여 sh가 예상한 것과 다르게 문자열을 구문 분석하도록 하여 이상한 동작을 유발할 수 있습니다.
그렇다면 이것이 사실인가요? 아니면 저자가 단순히 틀렸습니까?
답변1
Stack Exchange에서 찾은 답변은 정확하고 이 튜토리얼은 잘못되었습니다. 직접 시도해 볼 수도 있고 온라인에서 찾아볼 수도 있습니다.기준. 설정을 해제하는 것은 IFS
기본값인 space-tab-newline으로 설정하는 것과 동일하며, 비어 있으면 IFS
필드 분할이 효과적으로 꺼집니다.
상담하실 수 있습니다IFS의 Sven Mascheck 페이지역사적 실현에 대해. 일부 역사적 쉘은 이것을 좋아하지 않으며 unset IFS
아주 오래된 ksh 버전은 이를 null로 취급 IFS
하지만 모든 최신 쉘과 대부분의 오래된 쉘은 unset을 IFS
기본값으로 취급합니다.
IFS=
필드 분할을 끄고 싶지 않은 경우(아마도 합리적인 결정일 수 있지만 와일드카드를 피하기 위해 대체 항목 주위에 큰따옴표를 넣어야 한다는 점에 유의하세요. 이 기능도 끄지 않는 한 set -f
) 스크립트를 시작하면 안 됩니다. 기본값을 재설정하려면 를 사용하십시오 unset IFS
. 이것이 스크립트 시작 부분에 유용한지는 논쟁의 여지가 있습니다. PATH
호출자가 스크립트 오류를 만들기 위해 이상한 일을 할 수 있는 것처럼 다른 나쁜 일도 많이 있습니다 .
이 튜토리얼에서는 재설정도 권장합니다 PATH
. 이것은 일반적으로 나쁜 조언입니다. 대부분의 경우 올바른 검색 경로가 무엇인지 예측할 수 없지만 사용자는 예측합니다. 버그가 있는 고대 UNIX에 버그 수정 버전의 유틸리티가 /usr/local/bin
포함되어 있는지 어떻게 알 수 있습니까? 앞으로 나아갈지 여부를 결정하기 위해 모든 논리를 포함하고 싶습니까 ? 당신은 어떤 입장을 원하시나요 ? 스크립트가 특정 시스템을 대상으로 하지 않는 한 PATH를 재설정하지 마십시오./home/bob/bin
/usr/bin
/usr/xpg6/bin
/bin
/usr/gnu/bin
튜토리얼을 읽지는 않았지만 한 가지 확인했습니다. 처음부터 변수 대체 및 명령 대체에 항상 큰따옴표를 넣으라고 말하지는 않았습니다. 그래서 저는 이 튜토리얼이 좋은 튜토리얼이 아니라고 생각합니다.