내 GNU bash 버전 4.2.8에서 IFS에는 공백, 탭 및 줄 바꿈에 대한 기본값이 있습니다.
usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000 20 09 0a | ..|
00000003
usr@T42 ~ $
이 기본 IFS에 대한 이유가 있습니까? 또한 bash에 내장된 유틸리티 외에 IFS를 사용하는 다른 유틸리티는 무엇입니까 read
?
답변1
IFS 변수는 쉘이 다음과 같은 작업을 실행할 때마다 사용됩니다.분사. 가장 일반적인 경우는 $var
명령에서 매개변수 확장(예:) 또는 명령 대체(예: 더 이상 사용되지 않는 백틱) 이후입니다. $(some-command)
여기서 확장에 IFS
문자가 포함되어 있으면 명령을 처리하기 전에 다른 "단어"로 분할됩니다. 실제로 이는 이러한 문자가 대체된 텍스트를 다른 인수(변수가 먼저 지정된 경우 명령 이름 포함)로 분할한다는 것을 의미합니다.
따라서 기본값이 공백, 탭 및 개행인 이유는 IFS
이것이 일반적으로 단어를 분할할 것으로 예상되는 공백 문자이기 때문입니다.
단어 분리가 발생하지 않도록 하는 한 가지 방법은 확장명( "$var"
) 주위에 큰따옴표를 사용하는 것입니다. 실제로 질문에서 이미 이 작업을 수행했습니다. 이렇게 하지 않으면 echo
매개변수가 없고 문자 분할 매개변수만 있으므로 출력이 없습니다 .
또한 분사의 두 장소에 주목하세요아니요매개변수 확장 및 변수 할당(예: 괜찮음) 후에 발생하며 var=$othervar
구문 var=$(somecommand)
내에서 [[ ]]
발생합니다( [[ $var = $othervar ]]
될 수 있지만 [ $var = $othervar ]
인용해야 함).
마지막으로, 어느 현자가 나에게 지적한 것처럼, 일반적인 오해는 단어 분할을 방지하는 것이 가장 중요하다는 것입니다.오직변수가 참조되는 이유입니다. 그렇지 않습니다. 인용문도 차단됩니다.경로명 확장또는글로벌 확장더 많이 알려졌기 때문이죠. 변수에 이와 같은 전역 문자가 포함되어 있는 경우 *
명령에서 변수를 따옴표 없이 사용하면 이러한 문자가 파일 이름으로 확장될 수 있습니다. 예를 들어 다음을 고려하십시오.
var=*
echo $var
그러면 현재 디렉터리에 있는 파일 이름이 표시됩니다.
~처럼스티븐은 아래에서 지적합니다., 확장 시 문자 순서가 IFS
중요합니다 "$*"
. bash
매뉴얼 페이지 에서 :
"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable. If IFS is unset, the parameters are separated by spaces. If
IFS is null, the parameters are joined without intervening separators.
단어 분할에 대한 더 많은 예를 보려면 이 답변을 참조하세요.https://unix.stackexchange.com/a/118444/48083