'>'에 관한 경고
단지 I / O 리디렉션 (에 대해 배운 유닉스 초보자 <
와는 >
) 종종 같은 것들을 시도
명령 ... input_file > the_same_file
또는
명령 ... < 파일 > the_same_file
또는 거의 동등하게
고양이 파일 | 명령 ...> the_same_file
( grep
, sed
, cut
, sort
, 그리고 spell
사람들이 이런 구조에 사용하는 유혹 명령의 예입니다.) 사용자는 이러한 시나리오가 비어되는 파일이 발생할 것을 발견 놀랄 수 있습니다.
다른 답변에서 언급되지 않은 뉘앙스 는 bash (1) 의 Redirection 섹션의 첫 번째 문장에 숨어 있습니다 .
명령이 실행되기 전에
셸이 해석하는 특수 표기법을 사용하여 입력 및 출력을 리디렉션 할 수 있습니다 .
처음 5 개 단어는 굵게, 기울임 꼴, 밑줄, 확대, 깜박임, 빨간색으로 표시되고 아이콘으로 표시되어 명령을 실행하기 전에 셸이 요청 된 리디렉션을 수행한다는 사실을 강조
해야합니다 . 또한 기억하십시오
출력을 재 지정하면 파일을 쓰기 위해 열린다.… 파일이 존재하지 않으면 파일이 작성됩니다. 존재하는 경우 크기가 0으로 잘립니다.
따라서이 예에서
sort roster > roster
셸 roster
은 sort
프로그램 실행을 시작 하기 전에 파일을 잘라서 잘라서 잘라냅니다 (즉, 내용을 모두 버림) . 당연히, 데이터를 복구하기 위해 아무것도 할 수 없습니다.
순진하게 기대할 수도 있습니다.
tr "[:upper:]" "[:lower:]" < poem > poem
더 좋을 수도 있습니다. 쉘은 왼쪽에서 오른쪽으로 경로 재 지정을 처리 하므로, 쓰기를 위해 열기 전에 (표준 출력을 위해) poem
읽기 위해 ( tr
표준 입력을 위해) 열립니다. 그러나 도움이되지 않습니다. 이 일련의 조작으로 두 개의 파일 핸들이 생성되지만 둘 다 동일한 파일을 가리 킵니다. 셸에서 읽을 파일을 열면 내용이 그대로 있지만 프로그램이 실행되기 전에 여전히 내용이 잘립니다.
그래서 어떻게해야합니까?
솔루션은 다음과 같습니다.
실행중인 프로그램에 출력 위치를 지정하는 고유 한 내부 기능이 있는지 확인하십시오. 이것은 종종 -o
(또는 --output=
) 토큰으로 표시됩니다 . 특히,
sort roster -o roster
대략적으로
sort roster > roster
첫 번째 경우를 제외하고 sort
프로그램은 출력 파일을 엽니 다. 때까지 그리고 출력 파일을 열 수없는만큼 똑똑 후에 는 입력 파일 (들)을 모두 읽을 수있다.
이와 유사하게, 적어도 일부 버전 sed
이 -i
(편집 내가 다시 입력 파일로 출력 출력을 작성하는 데 사용할 수있는 N 장소) 옵션을 (다시, 이후 모든 입력이 읽은). 같은 편집자 ed
/ ex
, emacs
, pico
, 및 vi
/은 vim
사용자가 텍스트 파일을 편집하고 원본 파일에서 편집 된 텍스트를 저장할 수 있습니다. 있습니다 ed
(적어도)는 비 대화식으로 사용할 수 있습니다.
vi
관련 기능이 있습니다. 을 입력 하면에 편집 버퍼의 내용을 출력하고 출력을 읽고이를 버퍼에 삽입합니다 (원본 내용을 바꿉니다).:%!command
Entercommand
간단하지만 효과적인:
명령 … input_file > temp_file && mv temp_file input_file
이는 input_file
링크 인 경우 별도의 파일로 대체 될 수 있는 단점이 있습니다. 또한 새 파일은 기본 보호 기능으로 소유합니다. 특히 원본 input_file
이 아니더라도 파일을 세계에서 읽을 수있게 될 위험이 있습니다 .
변형 :
command … input_file > temp_file && cp temp_file input_file && rm temp_file
여전히 (잠재적으로) temp_file
세상을 읽을 수있게 할 것입니다 더 나은 :
cp input_file temp_file && command … temp_file > input_file && rm temp_file
이로 인해 파일의 링크 상태, 소유자 및 모드 (보호)가 유지되며 잠재적으로 I / O의 2 배가됩니다. (당신은 같은 옵션을 사용해야 할 수도 -a
나 -p
에 대한 cp
특성을 보존하도록 지시 할 수 있습니다.)
command … input_file > temp_file &&
cp --attributes-only --preserve=all input_file temp_file &&
mv temp_file input_file
(가독성을 위해 별도의 행으로 분리됨) 파일의 모드 (루트 인 경우 소유자)를 유지하지만 사용자가 소유 한 파일 (루트하지 않은 경우)을 만들고 새 파일로 만듭니다. 별도의 파일.
이 블로그
( "파일 내"편집)는 제안하고 설명합니다.
{rm input_file && command …> input_file ; } < input_file
이를 위해서는 command
표준 입력을 처리 할 수 있어야하지만 거의 모든 필터가 가능합니다. 블로그 자체는 이것을 위험한 kludge라고하며 사용을 권장하지 않습니다. 그리고 이것은 또한 당신이 소유하고 기본 권한을 가진 새로운 별도의 파일 (아무것도 링크되지 않은)을 만듭니다.
moreutils 패키지에는 다음과 같은 명령이 있습니다 sponge
.
명령 … input_file | 스폰지 the_same_file
자세한 내용은 이 답변 을 참조하십시오.
나에게 완전히 놀랐던 것이있다 :
syntaxerror 말한다 :
[이러한 솔루션의 대부분은] "읽기 전용"당신이 있다는 것을 의미 읽기 전용 파일 시스템에 실패 $HOME
할 것이다 쓸 수 있지만 /tmp
됩니다 읽기 전용 (기본적으로). 예를 들어, Ubuntu가 있고 복구 콘솔로 부팅 한 경우가 일반적입니다. 또한, 여기-문서 운영자 <<<
가 필요로 하나가 작동하지 않습니다 /tmp
수 읽기 / 쓰기
그것뿐만 아니라 거기에 임시 파일을 쓰기 때문입니다.
(cf. 이 질문 에는 strace
'd 출력 이 포함됩니다 )
이 경우 다음이 작동 할 수 있습니다.
그래서 질문은 무엇입니까?
이것은 U & L에서 인기있는 주제였습니다. 다음 질문에서 다룹니다.
… 그리고 그것은 슈퍼 유저 나 Ask Ubuntu를 포함하지 않습니다. 위의 질문에 대한 답변의 많은 정보를이 답변에 통합했지만 전부는 아닙니다. (자세한 내용은 위에 나열된 질문과 답변을 읽으십시오.)
추신 : 나는 위에 인용 한 블로그와 아무런 관련 이 없습니다 .