이 명령은 어떻게 합법적입니까? “> file1 <file2 cat”


61

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

> file1 < file2 cat

의 콘텐츠를 복사하는 file2것 같습니다 file1.

그러나 나는이 구조를 이해할 수 없습니다.

"아무것도"가 file1(콘텐츠를 만들거나 지우는 ) 것으로 향하고 있음을 이해합니다 . 그런 다음의 내용 file2이로 전달됩니다 file1.

catfile2? cat file2피연산자가 올바른 순서가 아닌지 어떻게 알 수 있습니까?


11
"정확한 주문"은 무엇입니까? "정확한 순서"가 설명 된 일부 자원 / 학습 자료에 대한 링크를 제공 할 수 있습니까?
궤도에서 가벼움 경주

7
이와 같은 질문을 할 때는 쉘을 지정해야합니다. 서로 다른 경우, 특히 리디렉션과 관련하여 다른 경우가 있습니다.
chrylis

답변:


117

쉘은 cat명령 행 에서 명령을 실행하기 전에 경로 재 지정을 찾습니다.

두 가지 리디렉션이 있습니다.

  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모든 유틸리티 가하는 기능이 아닌의 기능 및 기타 유틸리티의 기능입니다 .

catoperand가 주어지면 표준 입력에서 읽습니다 -. 다시 말하지만, 이것은 cat다른 유틸리티 에만 해당됩니다 (즉, 이 수행하지 않는 기능). cat이름 현재 디렉토리에있는 파일에서 사용하려면 파일 이름 -에 대한 경로 (예 :)를 추가하십시오 ./-.

¹ 일부 상황에서는 리디렉션 순서가 여전히 중요합니다. 로 cat <file2 >file1예를 들어, file1경우 절단되지 않습니다 file2액세스 할 수없는합니다 (리디렉션이 왼쪽에서 오른쪽으로 구문 분석). cat그러나 단어의 상대적 배치는 여전히 임의적이며 이에 영향을 미치지 않습니다.

² " cat 존재하지 않는 파일을 열 때 다른 오류가 발생합니다 "질문을 참조하십시오 .


쉘이 명령 행에서 명령을 실행하기 전에 경로 재 지정을 설정한다는 사실은 이와 같은 것들이 실패하고 빈 출력 파일로 끝나는 이유입니다.

$ sort file >file

여기서 셸은 표준 출력을 file실행 sort file하고 파일에 연결 하기 전에 파일을 자릅니다 (빈) sort. 그러면 sort유틸리티가 file내용 을 열고 정렬합니다 (아무 것도 아님). 결과 (아무것도)는 표준 출력 스트림을 통해로 전달됩니다 file.

이 특정 경우 (파일을 "in-place"정렬하는 경우)의 해결책은 다음과 같습니다.

$ sort -o file file

또는

$ sort file >file.sorted && mv file.sorted file

이는 파일을 사용하여 출력 파일 이름을 지정할 sort때 수행하는 작업의 양 -o입니다.


명령 행에서 경로 재 지정이 유틸리티의 실제 이름 앞에 올 수 있다는 명령문을 백업하기 만하면됩니다.

"간단한 명령"은 제어 연산자에 의해 종료되는 임의의 순서대로 선택적 변수 할당 및 재지향의 순서이며, 임의의 순서로 단어 및 재지향이 뒤 따릅니다. [참조 : POSIX Shell Command Language 2.9.1 간단한 명령]

또한 리디렉션이 유틸리티의 피연산자에 속하지 않는 것에 대해서도 :

선택적인 번호, 방향 전환 연산자 및 단어는 실행될 명령에 제공된 인수 (있는 경우)에 나타나지 않아야합니다. [참조 : POSIX 쉘 명령 언어 2.7 리디렉션]


14
@Steve 처음 <in foo | bar >out에 입력 경로 재 지정이있는 파이프 라인 이 모든 것을 논리적 순서로 배치 하는 것과 같이 경로 재 지정을 자유롭게 이동할 수 있으므로 일부 명령을 더 명확하게 만들 수 있습니다 . echo >&2 Something bad happened쉘 스크립트에서 오류가 출력되는 것을 좋아합니다 . 그러나 >out <in cat난독 화입니다

2
어떻게 sort file >file정확하게 성취 될 수 있습니까?
seth10

11
@setht sort -o file file.
Kusalananda

6
좋은 대답입니다. 순서가 중요합니다. 열 수 없으면 잘리지 않는 것 < file1 > file2 cat보다 낫 습니다. > file2 < file1 catfile2file1
Stéphane Chazelas

3
알아 두어야 할 사항 : HTML 단편으로 POSIX에 링크 할 때 단편이 스펙의 동일한 개정판 사이에서 변경되는 것으로 알려진 정확한 개정판 (예 : pubs.opengroup.org/onlinepubs/9699919799.2016edition ) 을 지정하는 것이 좋습니다. (2016 버전이 출시 된 후 조각이 잘못된 위치를 가리 키므로 내 사이트를 포함한이 사이트의 답변에 대한 많은 링크가 잘못되었습니다).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.