file2
이미 존재한다고 가정하면 다음 명령은
> file1 < file2 cat
file2
콘텐츠가 에 복사되는 것 같습니다 file1
.
하지만 저는 이 구조를 이해할 수 없습니다.
나는 "없음"의 목적이 file1
(콘텐츠 생성 또는 삭제)임을 이해합니다. 그러면 콘텐츠가 file2
로 이동됩니다 file1
.
왜 cat
이후에 file2
? cat file2
피연산자의 순서가 잘못된지 어떻게 알 수 있나요 ?
답변1
쉘은 cat
명령줄에서 명령을 실행하기 전에 모든 리디렉션을 처리합니다. 리디렉션에는 <
(stdin, 읽기 전용), <>
(stdin, 읽기+쓰기), >
(stdout, 쓰기 전용) 및 >>
(stdout, 쓰기 전용, 추가 출력)을 사용하여 입력 또는 출력 리디렉션이 포함되며 <<word
(여기 문서) 도 포함됩니다. 및 <<<'...'
(일부 쉘에서는 "여기 문자열"). 입력 또는 출력을 리디렉션하는 효과를 가지려면 이러한 리디렉션 연산자를 따옴표로 묶어야 하며, 기본값(연산자에 따라 stdin(0) 또는 stdout(1)) 대신 리디렉션할 파일 설명자를 지정하기 위해 숫자를 앞에 추가할 수 있습니다.
표시되는 명령에는 두 가지 리디렉션이 있습니다.
>file1
그러면 명령의 표준 출력이 로 이동됩니다file1
.<file2
그러면 명령의 표준 입력이 에서 나옵니다file2
.
이러한 리디렉션이 명령줄의 불안정한 위치에 배치된다는 사실은 중요하지 않습니다.
$ cat <file2 >file1
동일합니까?
$ <file2 cat >file1
이는 다음과 같습니다.
$ <file2 >file1 cat
잠깐만 ¹
cat
이러한 모든 인스턴스의 유틸리티는 다음 과 같이 실행됩니다.명령줄 인수 없이. 리디렉션은 cat
명령에 대한 피연산자가 아니며 명령과의 리디렉션을 설정하는 셸에 대한 지침입니다(표준 입력 및 출력을 파일에 연결). 쉘 설정 리디렉션앞으로명령을 호출하십시오.
cat file
과 cat <file
(또는 선호하는 경우) 의 차이점 <file cat
은 첫 번째 경우 cat
유틸리티 자체가 읽기 위해 파일(명령줄에서 피연산자로 제공됨)을 여는 반면, 두 번째 경우에는 유틸리티 자체가 열린다는 것입니다. 읽기 위해 파일을 엽니다.껍데기파일을 열고 cat
입력 스트림을 파일에 연결합니다². 두 번째 경우에는 cat
파일 피연산자가 제공되지 않고 자동으로 표준 입력 읽기로 전환됩니다. 이는 cat
일부 다른 유틸리티의 기능이기도 하지만 모든 유틸리티에 이 기능이 있는 것은 아닙니다.
cat
피연산자가 제공되면 해당 표준 입력도 읽혀집니다 -
. 다시 말하지만, 이는 cat
특정 유틸리티에만 특별합니다(즉, 특별한 것은 아닙니다).껍데기하다). cat
이름이 현재 디렉토리에 있는 파일 의 경우예 -
, 파일 이름 경로를 추가합니다(예 ./-
: .
1 어떤 경우에는 리디렉션 순서가 여전히 중요합니다. 예를 들어 연결할 수 없는 cat <file2 >file1
경우 file1
잘리지 않습니다 file2
(리디렉션은 왼쪽에서 오른쪽으로 구문 분석됨). 그러나 단어의 상대적 위치는 cat
임의적이며 이에 영향을 미치지 않습니다.
² 질문도 참조하세요존재하지 않는 파일을 열 때 고양이가 다른 오류를 발생시킵니다..
실제로 셸은 명령줄에서 명령을 실행하기 전에 리디렉션을 설정하므로 이러한 작업이 실패하고 빈 출력 파일이 생성됩니다.
$ sort file >file
여기서 쉘은 표준 출력을 file
실행 하고 파일에 연결하기 전에 파일을 잘라냅니다 . 그러면 유틸리티가 열리고 내용이 정렬됩니다 ( 아무 것도 없음). 결과(없음)는 표준 출력 스트림을 통해 .sort file
sort
sort
file
file
이 특별한 경우(파일을 "제자리"로 정렬하는 경우)의 해결 방법은 다음과 같습니다.
$ sort -o file file
또는
$ sort file >file.sorted && mv file.sorted file
또는 원본 파일이 삭제되지 않았는지 확인하려면(일부 파일 메타데이터를 보존하기 위해)
$ cp file file.unsorted && sort file.unsorted >file && rm -f file.unsorted
sort
이는 file을 사용하여 -o
출력 파일 이름을 지정할 때 수행하는 작업과 거의 비슷합니다 .
명령줄에서 유틸리티의 실제 이름 앞에 올 수 있는 명령문의 리디렉션을 지원하기 위해(강조):
"간단한 명령"은 일련의 선택적 변수 할당 및 리디렉션입니다.어떤 순서로든, 선택적으로 단어와 리디렉션이 뒤따르고 제어 연산자로 종료됩니다.[참고: POSIX 쉘 명령 언어 2.9.1 단순 명령]
또한 유틸리티 피연산자의 일부가 아닌 리디렉션에 대해:
선택적 숫자, 리디렉션 연산자 및 단어는 실행할 명령에 제공된 인수(있는 경우)에 나타나서는 안 됩니다.[참조: POSIX 쉘 명령 언어 2.7 리디렉션]