2011-01-11 2 views
3

다음 줄에서 파일을 읽는 셸 스크립트로 작성된 코드 조각을 발견했습니다.파일에서 읽을 때 exec 명령의 중요성

BAKIFS=$IFS 
IFS=$(echo -en "\n\b") 
exec 3<&0 
exec 0<"$FILE" 
while read -r line 
do 
# use $line variable to process line in processLine() function 
processLine $line 
done 
exec 0<&3 

# restore $IFS which was used to determine what the field separators are 
IFS=$BAKIFS 

언급 한 세 가지 명령의 필요성을 이해할 수 없습니다. 누군가 나를 위해 정교하게 만들 수 있습니까? 또한 $ ifs 변수는 파일을 읽을 때마다 다시 설정됩니까?

답변

8

exec (인수 없음)은 새 프로세스를 시작하지 않지만 현재 프로세스의 파일 핸들을 조작하는 데 사용할 수 있습니다.

은 무엇이 라인이하고있는 것은 :

  • 일시적 3.
  • $FILE에서 읽을 수있는 표준 입력을 수정 파일 핸들에 현재의 표준 입력 (파일 핸들 0)를 저장합니다.
  • 독서를하십시오.
  • 표준 입력을 원래 값 (파일 핸들 3에서)으로 되돌립니다. 모든 read는 그것이 while 루프 기간 동안 "\n\b"로 유지하고 IFS=$BAKIFS (이전에 저장)를 원래의 값으로 재설정 후

IFS 리셋되지 않는다. 상세


가 :

BAKIFS=$IFS     # save current input field separator 
IFS=$(echo -en "\n\b")   # and change it. 

exec 3<&0      # save current stdin 
exec 0<"$FILE"     # and change it to read from file. 

while read -r line ; do  # read every line from stdin (currently file). 
    processLine $line   # and process it. 
done 

exec 0<&3      # restore previous stdin. 
IFS=$BAKIFS     # and IFS. 
+0

고맙습니다. pax .... 내가 백그라운드에서 서버에서이 스크립트를 실행한다고 가정 해보십시오. while 루프의 지속 기간 동안 표준 입력은 3으로 설정됩니다. 표준 입력을 사용할 수 없다는 의미입니까? 그 기간 동안 다른 프로그램을 읽는가? 이 의존성을 없애기위한 아이디어가 있습니까? – ayush

+1

해당 파일 핸들은 _process_에 속하며 시스템 전체 리소스가 아닙니다. 예를 들어, 모든 프로세스는 다른 프로세스와 충돌하지 않고 자체 표준 입력 (파일 핸들 0)을 가져옵니다. 그래서, 만약 당신이 그 프로그램과 별개로 실행되는 프로그램에 대해 말한다면, 아니오. 물론 프로세스 내에서 while 루프 내에서 "진짜"표준에서 다른 행을 읽지 못합니다 (예 : 파일에서 다음 행을 얻음). – paxdiablo

+0

다시 한 번 감사드립니다 ... 이제 알았습니다. – ayush

0

표시된 코드는 동일합니다 : 그런데

while read -r line 
do 
    ... 
done < "$FILE" 

, 당신은이 작업을 수행 할 수 있습니다

IFS=$'\n' 

를 껍질 등으로 그것을 지원하는 Bash로서.

관련 문제