while 루프와 문서는 여기에 있습니다. 언제 무슨 일이 발생합니까?

while 루프와 문서는 여기에 있습니다. 언제 무슨 일이 발생합니까?

나는 이 while 루프를 여기 문서와 결합하여 Bash 4.3.48(1)에서 실행하고 있지만 그 논리를 전혀 이해하지 못합니다.

while read file; do source ~/unwe/"$file"
done <<-EOF
    x.sh
    y.sh
EOF

내 질문은 다음 부분으로 구성됩니다.

  1. 여기서 해야 할 일 read(저는 항상 read변수를 선언하고 값을 할당하는 데 사용합니다.대화형으로, 그러나 여기서 해야 할 일을 놓쳤습니다).

  2. 무슨 뜻인가요 while read? 여기의 개념은 어디 while에서 왔습니까?

  3. 문서 자체가 여기에 나타나는 경우뒤쪽에루프, 루프는 어떤 영향을 받나요? 내 말은, done루프 내부가 아닌 뒤에 나타나는데 , 이 두 구조 사이의 실제 연결은 무엇입니까?

  4. 왜 실패했나요?

    while read file; do source ~/unwe/"$file" done <<-EOF
        x.sh
        y.sh
    EOF
    

    제 말은, 그렇습니다... 그러면 done루프와 같은 줄에 있는 것이 done왜 중요한가요 ? 내 기억이 정확하다면 done <<-EOF루프가 한 줄이지만 여전히 작동하는 상황을 접한 적이 있습니다 .for

답변1

  1. read명령은 표준 입력 스트림에서 읽고 읽은 내용을 변수에 할당합니다 file(이보다 조금 더 복잡합니다.여기서 긴 토론). 표준 입력 스트림은 here-document에서 제공되며 after 루프로 리디렉션됩니다 done. 데이터가 제공되지 않는 경우어디에서나, 터미널에서 대화형으로 읽습니다. 그러나 이 경우 쉘은 입력 스트림을 이 문서에 연결하도록 배열했습니다.

  2. while readread명령이 0이 아닌 종료 상태를 반환할 때까지 루프가 반복됩니다 . 이는 오류가 있는 경우 또는 (가장 일반적으로) 더 이상 읽을 데이터가 없는 경우(입력 스트림이 파일 끝 상태인 경우) 발생합니다.

    관례적으로 호출 쉘에 오류나 "false" 또는 "no" 신호를 보내려는 모든 유틸리티는 0이 아닌 종료 상태를 반환하여 신호를 보냅니다. 0 종료 상태는 "true", "yes" 또는 "error no error"를 의미합니다. 이 상태를 확인하시겠습니까? $?(마지막으로 실행된 유틸리티에서만) 종료 상태는 if문과 while루프 또는 테스트가 필요한 모든 곳 에서 사용할 수 있습니다 . 예를 들어

    if grep -q 'pattern' file; then ...; fi
    
  3. 여기에 있는 문서는 다음과 같습니다.리디렉션의 한 형태. 이 경우 루프로 리디렉션됩니다. 루프 내부의 모든 내용을 읽을 수 있지만 이 경우 명령만 read읽을 수 있습니다. 여기에서 설명서를 읽어보세요. 입력이 일반 파일에서 오는 경우 마지막 줄은 다음과 같습니다.

    done <filename
    

    루프를 명령으로 생각하면 더 직관적일 수 있습니다.

    while ...; do ...; done <filename
    

    이건 상황이야

    somecommand <filename
    

    일부 쉘은 "here-strings"도 지원합니다 <<<"string".

    cat <<<"This is the here-string"
    

    데이비드 포스터는 다음과 같이 지적합니다.두 스크립트 중 하나가 파일이나 다른 곳에서 읽을 데이터를 명시적으로 제공하지 않고 표준 입력에서 x.sh읽는 경우 읽은 데이터는 실제로 here 문서에서 나옵니다.y.sh

    x.sh에 만 포함된 경우 read a변수 a에 문자열이 포함 y.sh되고 y.sh스크립트가 실행되지 않습니다. 이는 표준 입력이 다음과 같이 리디렉션되기 때문입니다.모두명령을 루프에 추가하면 while(또한 호출 스크립트나 명령에 의해 "상속"됨) 두 번째 줄은 x.sh루프가 읽을 수 있기 전에 "사용"됩니다.whileread

    이 동작이 바람직하지 않으며 방지할 수 있는 경우그런데 좀 까다롭네요.

  4. ;앞에 개행 문자가 없기 때문에 실패합니다 done. 앞에 ;a 또는 개행 문자 가 없으면 done해당 단어는 done인수로 처리되며 source루프도 제대로 닫히지 않습니다(구문 오류입니다).

    모든 것을 개행으로 대체할 수 있다는 것은 거의 사실입니다 ;(적어도 명령 구분 기호인 경우). |, &, &&||(아마 잊어버린 다른 것들도 있을 것입니다) 처럼 명령의 끝을 표시합니다.

답변2

기본적으로 객체를 문서로 생성한 다음 다시 while 루프로 리디렉션하고 남은 줄이 없을 때까지 한 줄씩 읽고 해당 줄에서 소스 명령을 실행합니다.

또 다른 방법은 다음과 같습니다.

가상선

x.sh
y.sh

다음 파일에서:

input.txt

우리는 실행할 수 있습니다

cat input.txt | while read file
   do source ~/unwe/"$file"
done

여기에 있는 문서는 작업을 더욱 대화식으로 만들어 주지만 위의 예를 보면 이에 대한 더 나은 아이디어를 얻을 수 있습니다.

관련 정보