여기서 출구가 필요하지 않은 이유는 무엇입니까?

여기서 출구가 필요하지 않은 이유는 무엇입니까?
$ IFS=";"

$ read first second 
i am;a_i b c
$ echo $first
i am
$ echo $second
a_i b c

$ echo $IFS
  1. 내 말이 맞습니까? 이것은 read first second현재 쉘 프로세스의 하위 프로세스입니까? 그렇다면 왜 필요하지 않습니까 export IFS=";"?
  2. 왜 비어 있나요 IFS?

답변1

내 말이 맞습니까? 읽은 첫 번째 순간은 현재 쉘 프로세스의 하위 프로세스입니까? 그렇다면 IFS=";"를 내보낼 필요가 없는 이유는 무엇입니까?

read하나도 아니야배쉬 내장 함수. 여기서는 하위 쉘이나 하위 프로세스가 생성되지 않으므로 IFS.

IFS가 비어 있는 이유는 무엇입니까?

큰따옴표를 사용하지 않았기 때문입니다. IFS 값을 로 변경했으므로 로 ;확장 echo $IFS하면 쉘은 단어 분할 및 와일드카드를 수행하기 위해 구분 기호로 사용됩니다. 그러면 아무것도 인쇄되지 않습니다.$IFS;;

노력하다:

$ IFS=";"
$ printf "%s\n" $IFS

$ printf "%s\n" "$IFS"
;

노트

답변2

입력하면 type read을 얻습니다 read is a shell builtin. 따라서 하위 프로세스로 실행되지 않습니다.

답변3

IFS가 비어 있는 이유를 답하십시오. 그렇지 않습니다. 그러나 그 가치는 IFS쉘의 동작을 변경하는 데 있습니다. 다음은 설명이 아니라 Debian Gnu+Linux에서 bash를 사용한 실험 결과입니다.

a=";"; echo $a생산하다 ;.

IFS=";"; echo $IFS빈 줄을 생성합니다. IFS=";"; echo "$IFS"생산하다 ;.

이제 a=";"; echo $a빈 줄이 생성되지만 IFS=" "; a=";"; echo $a다시 ;.

그래서

이제 IFS=";"; a=";"; echo $a빈 줄을 생성 IFS=" "; a=";"; echo $a하지만 ;.

따라서 IFS 값은 동작을 변경합니다(그러면 에코에 따옴표를 사용하지 않음).

답변4

IFS=\;; set -- $IFS; echo $#; echo "$*"

1
;

IFS=; set -- $IFS; echo $#; echo "$*"

0
#there doesn't seem to be anything here

보시다시피 - $IFS첫 번째 경우에는 비어 있지 않으며 필드 구분 기호만 포함되어 있습니다.

쉘이 인용되지 않은 변수를 확장할 때 에 정의된 구분 기호에 따라 해당 값을 분할합니다 $IFS. 이렇게 하면 각 변수가 $IFS별도의 배열이 될 수 있습니다. 기본적으로 $IFSa <space>, \tab 및 \newline 으로 설정됩니다. 이들 각각은 특별한 $IFS특성을 가지고 있습니다.$IFS공백. $IFS공백구분 기호는 유지되지 않으며, 쉘이 토큰화를 수행할 때 모든 시퀀스는 단일 필드로 잘리고 다른 모든 시퀀스에는 구분 기호당 하나의 필드가 있습니다.$IFS공백또한 필드의 시작이나 끝에서도 완전히 제거됩니다. 예를 들어:

IFS=/; slashes=///////; printf '<%s>' $slashes
<><><><><><><>

IFS=' '; spaces='      '; printf '<%s>' $spaces
<>

printf '<%s>' $spaces$slashes
<///////>

하지만$IFS공백확실히아니요삭제되면아니요존재하다 $IFS:

IFS=/; printf '<%s>' $spaces$slashes
<      ><><><><><><>

관련 정보