복합 명령에 사용되는 명령 리디렉션 제공

복합 명령에 사용되는 명령 리디렉션 제공

< myfile명령에서 입력 또는 출력( , 또는 )에 대한 > myfile리디렉션을 제공 하려면 , 및test-commandsconsequent-commandscommand1command2

if test-commands; then
consequent-commands;

until test-commands; do consequent-commands; done

while test-commands; do consequent-commands; done

command1 && command2

command1 || command2

리디렉션을 어디에 배치해야 합니까?

예를 들어, 나는 본다

while read a; 
  do echo "$a"; 
done < myfile;

< myfile왜 뒷면 done이 아닌 뒷면 인지 궁금합니다 read a.

또한 (이 기사의 첫 번째 단락에서와 같이) 더 폭넓게 생각하게 되었습니다.

  • 복합 명령에 나타나는 명령은 어디에 배치해야 합니까?

  • 리디렉션이 출력인지 입력인지가 중요합니까?

  • 복합 명령 끝에 리디렉션을 넣으면 리디렉션이 적용되는 복합 명령 내의 어떤 구성 요소 명령을 어떻게 알 수 있습니까?

감사해요.

답변1

간단한 명령 내 어디든 리디렉션을 배치할 수 있습니다(예: 별칭, 함수, 내장 함수 또는 인수를 사용하여 실행 파일 호출). 반면, 복합 명령에 리디렉션을 적용하려면 나중에 리디렉션해야 합니다. 이것이 쉘 구문이 설계된 방식입니다. 예를 들어 다음은 동일합니다.

<myinput mycommand argument
mycommand <myinput argument
mycommand argument <myinput

리디렉션을 이동할 수 없습니다.

while …; do …; done <myinput
{ command1; command2; } <myinput

복합 명령이 키워드나 구두점으로 끝나는 경우에만 리디렉션을 적용할 수 있습니다. 또는 같은 항목 에 리디렉션을 적용하려면 foo && bar다음 과 같이 명령을 중괄호 안에 넣으세요.foo; barfoo | bar

{ foo && bar; } <myinput

스크립트

while read a; do
  echo "$a"
done <myfile

그리고

while read a <myfile; do
  echo "$a"
done

둘 다 구문상 정확하지만 두 번째 것은 유용한 작업을 수행하지 않습니다. 명령의 리디렉션 연산자는 다음을 의미합니다.

  1. 지정된 파일을 엽니다.
  2. 지정된 파일을 필수 파일 설명자에 추가합니다(예: 0은 을 의미함 <).
  3. 명령을 실행하십시오.
  4. 파일 설명자를 닫습니다.

따라서 read a <myfile반복할 때마다 파일이 다시 열립니다. 즉, 첫 번째 줄을 영원히 읽습니다.

읽는 동안 루프를 사용하고 루프 본문의 주변 표준 입력을 유지하려면 다른 파일 설명자에서 읽으십시오.

while read a <&3; do
  # commands that can use stdin
done 3<myfile

리디렉션 연산자는 <&3파일 설명자 복사만 수행하며 "파일을 다시 열지" 않습니다. 위의 열거에는 1단계가 없습니다.

답변2

간단한 명령의 경우 리디렉션 위치 지정은 같은 줄에 있고 어느 곳에나 있으면 유연 ;합니다.

command1 arg <file
<file command1 arg
command1 <file arg

스타일적으로는 일반적으로 첫 번째 형식이 선호됩니다.

파이프나 조건을 통해 연결된 명령의 경우 리디렉션은 연결된 명령과 동일한 쪽에 있어야 합니다. 첫 번째 명령이 입력을 받아야 하는 경우 다음을 수행해야 합니다.

command1 <file || command2

command2가 입력을 받으려면 다음을 수행하십시오.

command1 || command2 <file

while및 기타 블록 복합 명령의 경우 for리디렉션을 끝에 배치해야 하는 필요성은 단순히 구문론적 현실입니다.

<file { command1 || command2; } # error
{ command1 || command2; } <file  # okay

예를 들어 복합 명령은 이 컨텍스트에서 단일 명령으로 작동하므로 리디렉션된 입력은 command2를 대상으로 하고 command1을 제외할 수 없습니다.

물론 배관이 옵션인 경우도 있으므로 위의 두 번째 예는 다음과 같습니다.

cat file | { command1 || command2; }

while 루프의 경우:

cat myfile | while read a; do ...

이 모든 예제에서는 입력을 사용했지만 출력에도 동일하게 적용됩니다. 주의할 점은 입력과 출력을 모두 사용하거나 기타 다중 리디렉션 구성을 사용하는 경우입니다. 리디렉션은 왼쪽에서 오른쪽으로 처리됩니다.

더 읽어볼 내용은 다음과 같습니다.

http://wiki.bash-hackers.org/syntax/redirection

http://wiki.bash-hackers.org/howto/redirection_tutorial

관련 정보