이 명령은 어떻게 적법합니까? "> 파일 1 < 파일 2 고양이"

이 명령은 어떻게 적법합니까? "> 파일 1 < 파일 2 고양이"

file2이미 존재한다고 가정하면 다음 명령은

> file1 < file2 cat

file2콘텐츠가 에 복사되는 것 같습니다 file1.

하지만 저는 이 구조를 이해할 수 없습니다.

나는 "없음"의 목적이 file1(콘텐츠 생성 또는 삭제)임을 이해합니다. 그러면 콘텐츠가 file2로 이동됩니다 file1.

cat이후에 file2? cat file2피연산자의 순서가 잘못된지 어떻게 알 수 있나요 ?

답변1

쉘은 cat명령줄에서 명령을 실행하기 전에 모든 리디렉션을 처리합니다. 리디렉션에는 <(stdin, 읽기 전용), <>(stdin, 읽기+쓰기), >(stdout, 쓰기 전용) 및 >>(stdout, 쓰기 전용, 추가 출력)을 사용하여 입력 또는 출력 리디렉션이 포함되며 <<word(여기 문서) 도 포함됩니다. 및 <<<'...'(일부 쉘에서는 "여기 문자열"). 입력 또는 출력을 리디렉션하는 효과를 가지려면 이러한 리디렉션 연산자를 따옴표로 묶어야 하며, 기본값(연산자에 따라 stdin(0) 또는 stdout(1)) 대신 리디렉션할 파일 설명자를 지정하기 위해 숫자를 앞에 추가할 수 있습니다.

표시되는 명령에는 두 가지 리디렉션이 있습니다.

  1. >file1 그러면 명령의 표준 출력이 로 이동됩니다 file1.
  2. <file2 그러면 명령의 표준 입력이 에서 나옵니다 file2.

이러한 리디렉션이 명령줄의 불안정한 위치에 배치된다는 사실은 중요하지 않습니다.

$ cat <file2 >file1

동일합니까?

$ <file2 cat >file1

이는 다음과 같습니다.

$ <file2 >file1 cat

잠깐만 ¹

cat이러한 모든 인스턴스의 유틸리티는 다음 과 같이 실행됩니다.명령줄 인수 없이. 리디렉션은 cat명령에 대한 피연산자가 아니며 명령과의 리디렉션을 설정하는 셸에 대한 지침입니다(표준 입력 및 출력을 파일에 연결). 쉘 설정 리디렉션앞으로명령을 호출하십시오.

cat filecat <file(또는 선호하는 경우) 의 차이점 <file cat은 첫 번째 경우 cat유틸리티 자체가 읽기 위해 파일(명령줄에서 피연산자로 제공됨)을 여는 반면, 두 번째 경우에는 유틸리티 자체가 열린다는 것입니다. 읽기 위해 파일을 엽니다.껍데기파일을 열고 cat입력 스트림을 파일에 연결합니다². 두 번째 경우에는 cat파일 피연산자가 제공되지 않고 자동으로 표준 입력 읽기로 전환됩니다. 이는 cat일부 다른 유틸리티의 기능이기도 하지만 모든 유틸리티에 이 기능이 있는 것은 아닙니다.

cat피연산자가 제공되면 해당 표준 입력도 읽혀집니다 -. 다시 말하지만, 이는 cat특정 유틸리티에만 특별합니다(즉, 특별한 것은 아닙니다).껍데기하다). cat이름이 현재 디렉토리에 있는 파일 의 경우 -, 파일 이름 경로를 추가합니다(예 ./-: .

1 어떤 경우에는 리디렉션 순서가 여전히 중요합니다. 예를 들어 연결할 수 없는 cat <file2 >file1경우 file1잘리지 않습니다 file2(리디렉션은 왼쪽에서 오른쪽으로 구문 분석됨). 그러나 단어의 상대적 위치는 cat임의적이며 이에 영향을 미치지 않습니다.

² 질문도 참조하세요존재하지 않는 파일을 열 때 고양이가 다른 오류를 발생시킵니다..


실제로 셸은 명령줄에서 명령을 실행하기 전에 리디렉션을 설정하므로 이러한 작업이 실패하고 빈 출력 파일이 생성됩니다.

$ sort file >file

여기서 쉘은 표준 출력을 file실행 하고 파일에 연결하기 전에 파일을 잘라냅니다 . 그러면 유틸리티가 열리고 내용이 정렬됩니다 ( 아무 것도 없음). 결과(없음)는 표준 출력 스트림을 통해 .sort filesortsortfilefile

이 특별한 경우(파일을 "제자리"로 정렬하는 경우)의 해결 방법은 다음과 같습니다.

$ 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 리디렉션]

관련 정보