텍스트 처리 결과를 다시 입력 파일에 기록하는 이 두 명령이 그렇게 다르게 동작하는 이유는 무엇입니까?

텍스트 처리 결과를 다시 입력 파일에 기록하는 이 두 명령이 그렇게 다르게 동작하는 이유는 무엇입니까?

파일이 있는데 authorized_keys중복된 콘텐츠를 제거하고 싶습니다. 즉, 중복된 항목을 제거하고 싶습니다.

이를 달성하기 위한 두 가지 가능한 솔루션을 찾았습니다.

  1. 다음 을 사용하여 cat출력 uniq을 원본 파일로 리디렉션합니다.
    cat authorized_keys | uniq > authorized_keys
    
  2. sort옵션과 함께 사용 -o:
    sort -u ~/.ssh/authorized_keys -o ~/.ssh/authorized_keys
    

그러나 두 번째 옵션만 작동합니다. 첫 번째 방법은 빈 파일을 생성합니다.

출력을 다음과 같은 다른 파일로 리디렉션하면

cat authorized_keys | uniq > authorized_keys_2

새 파일에는 올바른 내용이 있지만

cat authorized_keys | uniq > authorized_keys

나에게 빈 것을 남겨주세요 authorized_keys.

이 두 가지 방법의 차이점을 이해하도록 도와주세요.

답변1

파일을 동시에 읽고 쓰기 때문에 첫 번째 솔루션은 작동하지 않습니다. 이렇게 하면 리디렉션(즉, ">" 기호)이 셸에서 처리되고 셸에 먼저 쓰기 위해 파일을 열어서 비우도록 지시하기 때문에 빈 파일이 생성됩니다. 그런 다음 명령은 다음과 같습니다.

cat authorized_keys | uniq

실행되지만 authorized_keys파일이 이제 비어 있으므로 빈 출력이 발생합니다. 이와 같은 문제를 방지하려면 authorized_keys_2입력을 저장하는 데 사용한 것과 같은 임시 파일을 사용한 다음 원본 파일을 임시 파일로 덮어쓸 수 있습니다.

답변2

확장하다사이즈모어의 답변...

~에서배쉬 매뉴얼 페이지

Redirecting Output

Redirection of output causes the file whose name results from the expansion
of word to be opened for writing on file descriptor n, or the standard 
output (file descriptor 1) if n is not specified. If the file does not exist 
it is created; if it does exist it is truncated to zero size. 

파일이 authorized_keys존재하므로 0으로 잘립니다.명령을 실행하기 전에.

그 다음에 cat파일 길이가 0이므로 결과 파일은 비어 있습니다.

이 과정에 대한 자세한 설명은 다음과 같습니다.이 답변도착하다쉘의 제어 및 리디렉션 연산자는 무엇입니까?

관련 정보