IFS의 기본값 이해


10

GNU bash 버전 4.2.8에서 IFS의 기본값은 공간, 탭 및 줄 바꿈입니다.

usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000  20 09 0a                                          | ..|
00000003
usr@T42 ~ $ 

이러한 기본 IFS에 대한 이유가 있습니까? 또한 bash 내장 기능 외에 IFS를 사용하는 유틸리티는 read무엇입니까?

답변:


13

IFS 변수는 쉘이 단어 splitting 이라는 작업을 수행 할 때마다 사용됩니다 . 이것이 사용되는 가장 일반적인 경우는 $var명령에서 매개 변수 확장 (예 $(some-command):) 또는 명령 대체 (예 : 더 이상 사용되지 않는 백틱) 후입니다. 확장에 IFS문자 가 포함되어 있으면 명령이 처리되기 전에 다른 '단어'로 분할됩니다. 사실상 이것은 이러한 문자가 대체 된 텍스트를 다른 인수로 분리 함을 의미합니다 (변수가 먼저 지정된 경우 명령 이름 포함).

따라서 IFS공백, 탭 및 줄 바꿈이 기본값 인 이유 는 일반적으로 단어를 나눌 것으로 예상되는 공백 문자이기 때문입니다.

단어 분리를 방지하는 한 가지 방법은 확장 ( "$var") 주위에 큰 따옴표를 사용하는 것 입니다. 실제로 질문에서이 작업을 수행했습니다. 이 작업을 수행하지 않으면 echo인수가없고 인수를 나누는 문자 만 출력되므로 출력 이 없습니다.

단어 분할이 두 곳 것도 참고 하지 않는 매개 변수 확장 후 발생이 변수 할당에있다 (예를 들면 var=$othervarvar=$(somecommand)괜찮습니다), 그리고 내부 [[ ]]구조 ( [[ $var = $othervar ]]확인하지만, [ $var = $othervar ]인용한다).

마지막으로, 현명한 사람이 한 번 지적한 것처럼, 일반적인 오해는 단어 분리 방지가 변수를 인용하는 유일한 이유 라는 것입니다 . 인용 부호는 경로 이름 확장 또는 glob 확장 이 더 일반적으로 알려진 것을 방지하지도 않습니다 . 변수에 glob 문자가 포함 *된 경우 명령에서 변수를 인용 부호로 사용하지 않으면 파일 이름으로 확장 될 수 있습니다. 예를 들어 :

var=*
echo $var

현재 디렉토리에있는 파일 이름이 표시됩니다.

Stephane이 아래 에서 지적한 것처럼 , 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


1
의 첫 번째 문자 $IFS도에 사용 "$*"되는 이유는 순서의 문제이다.
Stéphane Chazelas

2
또한 zshNUL 문자를 기본값으로 포함합니다 $IFS(다른 쉘은 변수에 NUL 문자를 포함하는 것을 지원하지 않습니다).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.