파일에서 가져오기: "고급"(보다 작음 기호 사용) 및 "초보자" 구문

파일에서 가져오기: "고급"(보다 작음 기호 사용) 및 "초보자" 구문

나는 다음을 읽었다.그림 모어:

간단한 예는 "이전" 파일의 "day"를 "new" 파일의 "night"로 변경하는 것입니다.

sed s/day/night/ <old >new

또는 다른 방법(UNIX 초보자의 경우),

sed s/day/night/ old >new

저자는 왜 첫 번째 형식이 더 발전된 형식이라고 생각합니까?

즉, "초보자" 구문에 비해 이 형식을 사용하면 어떤 이점이 있습니까?

답변1

쉘이 open()유사한 작업을 수행하도록 허용하면 다음과 같은 이점이 있습니다.

utility <in >out

명명된 유틸리티가 다음과 같은 작업을 수행하도록 허용하는 대신 open():

utility in >out

...파일 설명자는 안전합니다앞으로지정된 유틸리티를 호출합니다. 그렇지 않으면 open()유틸리티 도중 오류가 발생하면 유틸리티가 전혀 호출되지 않습니다. 이는 경쟁 조건으로 인한 부작용을 방지하는 가장 좋은 방법입니다. 이는 사용 시 때때로 발생합니다.개울그리고스트림 편집기.

리디렉션이 실패하면 쉘은 유틸리티에 대한 호출을 단락시키고 stderr에 오류 메시지를 기록합니다.껍데기일시적으로 유틸리티에 전달하는 것이 아닌 stderr(글쎄, 이는 리디렉션의 명령줄 순서에 따라 달라집니다)- 표준 진단 형식을 사용합니다. 파일을 열 수 있는지 테스트하는 가장 쉬운 방법은 파일을 열고 <다른 작업을 수행하기 전에 암시적으로 이 작업을 수행하는 것입니다.

아마도 귀하의 질문에 있는 명령에 표시된 가장 분명한 경쟁 조건은 다음과 같습니다.나가리디렉션. 두 형식 모두에서 쉘은 >쓰기 열기 도 수행하며 sed이는 두 번째 형식에서 읽기 위해 파일을 성공적으로 열 수 있는지 여부에 관계없이 발생합니다. 그래서나가잘렸으며 아마도 불필요할 수도 있습니다. 입력을 성공적으로 열 수 있는 경우에만 출력에 쓰려는 경우에는 좋지 않을 수 있습니다. 그러나 첫 번째 양식에서 했던 것처럼 항상 입력을 먼저 열면 문제가 되지 않습니다.


그렇지 않으면 적어도10숫자로 참조되는 파일 설명자는 쉘 리디렉션 구문을 사용하여 이러한 방식으로 조작할 수 있으며 이러한 조합은 약간 번거로울 수 있습니다.

또한 쉘이 open 작업을 수행할 때 디스크립터는 호출된 명령(두 번째 버전과 동일)에 속하지 않고 쉘에 속하며 호출된 명령은 이를 상속만 받습니다. 이는 동일한 복합 명령 내에서 호출되는 다른 명령과 동일한 방식으로 상속되므로 명령은 이러한 방식으로 입력을 공유할 수 있습니다.

답변2

sedSTDIN 및 매개변수를 통해 파일을 처리합니다.

첫 번째 형식에서는 입력 리디렉션 연산자를 사용하여 sed s/day/night/ <oldSTDIN을 통해 파일 콘텐츠를 전달합니다.oldsed

두 번째 형식에서는 sed s/day/night/ old파일 이름을 인수로 전달하기만 하면 됩니다 sed.

둘 다 정확하고 동일한 출력을 생성합니다.

저자가 의미하는 바는 표준 스트림과 그 기능, 리디렉션 연산자를 올바르게 사용하는 방법에 익숙하지 않은 경우 새로운 사용자가 첫 번째 스트림에 익숙해지기가 약간 어려울 수 있다는 것입니다. 그러나 이는 단지 내 의견일 뿐입니다. 작성자가 무엇을 하고 있는지 확실히 알 수 없습니다.

관련 정보