대화형 셸에서 IFS를 기본값이 아닌 다른 값으로 설정하는 이유는 무엇입니까?

대화형 셸에서 IFS를 기본값이 아닌 다른 값으로 설정하는 이유는 무엇입니까?

때로는 스크립트를 작성할 때 확장 방식을 IFS변경하는 등 (내부 필드 구분자)을 기본값이 아닌 다른 값으로 설정 해야 할 수도 있습니다 .$*

IFS이것이 완벽하게 합리적이긴 하지만 이것을 대화형 셸(제 기억이 맞다면 공백, 탭, 개행 문자)에서 기본값으로 설정할 이유가 전혀 없습니다 . 그럼에도 불구하고 대화형 셸에서는 IFS이를 기본값으로 설정할 수 없다는 말을 자주 듣습니다.

이거 진짜야? 누구든지 실제적인 예를 들어줄 수 있나요?

답변1

대화형 셸에서는 셸 시작 스크립트(예: for ) 또는 셸 시작 이후 실행된 다른 스크립트 또는 셸 함수 $IFS의 내용을 변경하지 않는 한 기본값이 됩니다 (일반적으로 셸 시작 스크립트에서 변경되지 않거나 다시 변경됩니다). 올바르게 작성된 경우 기본값).~/.bashrcbash

이러한 함수가 정의되어 있는 경우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를 (일시적으로) 변경할 수 있습니다. 특정 명령을 한 번만 사용하려는 경우 이를 쉘 스크립트에 작성할 이유가 없습니다. 그 외에는 쉘 스크립팅과 쉘을 직접 사용하는 것 사이에 차이가 없습니다.

관련 정보