< myfile
명령에서 입력 또는 출력( , 또는 )에 대한 > myfile
리디렉션을 제공 하려면 , 및test-commands
consequent-commands
command1
command2
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; bar
foo | bar
{ foo && bar; } <myinput
스크립트
while read a; do
echo "$a"
done <myfile
그리고
while read a <myfile; do
echo "$a"
done
둘 다 구문상 정확하지만 두 번째 것은 유용한 작업을 수행하지 않습니다. 명령의 리디렉션 연산자는 다음을 의미합니다.
- 지정된 파일을 엽니다.
- 지정된 파일을 필수 파일 설명자에 추가합니다(예: 0은 을 의미함
<
). - 명령을 실행하십시오.
- 파일 설명자를 닫습니다.
따라서 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 ...
이 모든 예제에서는 입력을 사용했지만 출력에도 동일하게 적용됩니다. 주의할 점은 입력과 출력을 모두 사용하거나 기타 다중 리디렉션 구성을 사용하는 경우입니다. 리디렉션은 왼쪽에서 오른쪽으로 처리됩니다.
더 읽어볼 내용은 다음과 같습니다.