때로는 스크립트를 작성할 때 확장 방식을 IFS
변경하는 등 (내부 필드 구분자)을 기본값이 아닌 다른 값으로 설정 해야 할 수도 있습니다 .$*
IFS
이것이 완벽하게 합리적이긴 하지만 이것을 대화형 셸(제 기억이 맞다면 공백, 탭, 개행 문자)에서 기본값으로 설정할 이유가 전혀 없습니다 . 그럼에도 불구하고 대화형 셸에서는 IFS
이를 기본값으로 설정할 수 없다는 말을 자주 듣습니다.
이거 진짜야? 누구든지 실제적인 예를 들어줄 수 있나요?
답변1
대화형 셸에서는 셸 시작 스크립트(예: for ) 또는 셸 시작 이후 실행된 다른 스크립트 또는 셸 함수 $IFS
의 내용을 변경하지 않는 한 기본값이 됩니다 (일반적으로 셸 시작 스크립트에서 변경되지 않거나 다시 변경됩니다). 올바르게 작성된 경우 기본값).~/.bashrc
bash
이러한 함수가 정의되어 있는 경우RC서류 또는 기타원천파일은 올바르게 작성되었으며 토큰화가 필요합니다. IFS의 현재 값에 대해 어떤 가정도 하지 않으므로 다른 값으로 설정해도 괜찮습니다.
그러나 일단 변경하면 나중에 실행할 때 명령줄이 해석되는 방식에 영향을 미칠 수 있으므로 수행한 작업을 기억해야 합니다.
예를 들어, 다음과 같은 경우:
IFS=:; ls -- $PATH
의 디렉토리를 나열하려면 $PATH
나중에 다음이 발생하는 이유가 궁금할 수 있습니다.
rm -f -- $(cat ~/my.file.list)
그만 일해. 따라서 다음과 같이 작성할 수도 있습니다.
(IFS=:; ls -- $PATH)
또는:
IFS=:; ls -- $PATH; unset IFS
(BTW, unset IFS
토큰화를 기본 동작으로 되돌리지만 아니요, $IFS
복원과 같은 작업을 수행하는 (부적절하게 작성된) 기능을 중단합니다.)oldIFS=$IFS; IFS=xxx; ...; IFS=$oldIFS
$IFS
답변2
물론, IFS
다양한 명령이 이 옵션 없이는 완전히 작동하지 않기 때문에 이를 기본값으로 설정할 수 있고 기대할 수 있습니다.
필요할 때(드물게 발생함) bash 스크립트에서 IFS를 변경하는 것과 같은 이유로 셸에서 IFS를 (일시적으로) 변경할 수 있습니다. 특정 명령을 한 번만 사용하려는 경우 이를 쉘 스크립트에 작성할 이유가 없습니다. 그 외에는 쉘 스크립팅과 쉘을 직접 사용하는 것 사이에 차이가 없습니다.