텍스트가 포함된 쉘 스크립트에서 편집기 실행

텍스트가 포함된 쉘 스크립트에서 편집기 실행

쉘 스크립트에서 기본 편집기를 시작할 수 있다는 것을 알고 있습니다. 예를 들어 $EDITOR환경 변수가 설정되어 있다고 가정합니다.

$EDITOR ~/newfile.txt

텍스트가 미리 입력된 새 파일을 열 수 있나요? 내가 생각할 수 있는 한 가지 방법은 파일을 열기 전에 파일을 만드는 것입니다.

echo "Header" > ~/newfile.txt
$EDITOR ~/newfile.txt

그러나 텍스트 편집기로 연 파일이 미리 채워져 있지만 삭제할 수도 있다면 더 좋을 것입니다. 가능합니까?

답변1

편집기에서 콘텐츠를 미리 채우려면 상상했던 대로 이 초기 콘텐츠를 파일에 작성하세요.

다른 편집기를 수용하기 위해 "편집기를 연 후 몇 줄을 입력할 수 있는 상태로 만드는" 방법은 없습니다. 많은 편집기에서 이는 파일이 저장되지 않음을 의미하지만 이 상태를 달성하는 통일된 방법이 없으며 일부 편집기에서는 이에 대한 개념이 전혀 없습니다(예:긁힌 자국).

그러나 파일이 저장되었는지 여부는 편집기에서 확인할 수 있습니다. 파일이 저장되지 않으면 작업을 중단하십시오. 파일이 저장되었는지 확인하려면 파일 전후의 수정 시간을 확인하세요.

file=$(mktemp)
cat <<EOF >"$file"
Hello
world
EOF
old_metadata=$(ls -li "$file")
"${VISUAL:-"${EDITOR:-vi}"}" "$file"
new_metadata=$(ls -li "$file")
if [ "$new_metadata" = "$old_metadata" ]; then
  … # unchanged file, abandon operation
else
  … # modified file, carry on
fi

파일이 수정되었지만 크기와 inode가 변경되지 않았고 수정 시간이 1초 미만인 경우 스크립트는 파일이 수정되지 않은 것으로 가정합니다. 사람이 편집하는 경우에는 이런 일이 발생하지 않지만, $EDITOR스크립트가 수정된 파일을 자동으로 커밋하면 쉽게 발생할 수 있습니다. 휴대용 방식으로 더 나은 작업을 수행하는 것은 어렵습니다. GNU coreutils를 사용하면 파일 시스템이 충분한 정밀도로 1초 미만의 타임스탬프를 지원하는 경우 옵션을 전달하여 --full-time이 문제를 해결할 수 있습니다.ls

또는 파일이 수정되었는지 확인하세요. 이를 수행하는 이식 가능한 방법은 초기 콘텐츠의 복사본을 보관하고 을 호출하는 것입니다 cmp. sha256sum또는 같은 명령을 sha사용할 수 있는 경우 해당 명령을 사용하고 전후의 해시를 비교할 수 있습니다. 파일의 타임스탬프가 변경된 경우에도 파일이 편집되었다고 생각하고 싶을 수도 있습니다. 사용자가 실제로 기본 입력을 제출하기를 원할 수도 있습니다.

많은 버전 제어 시스템은 커밋 메시지를 편집하기 위해 편집기를 시작할 때 이 기술을 사용합니다. 사용자가 파일을 저장하지 않으면 제출이 중단됩니다.

커서를 입력 끝 부분에도 배치하려는 경우 일반적인 방법은 없습니다. 많은 편집자들과 함께 당신은 글을 쓸 수 있습니다

"$EDITOR" +"$line" "$file"

편집기는 지정된 줄에 커서가 있는 상태로 열립니다. vi(모든 변형), emacs, joe 및 gedit를 포함하여 많은 편집기가 이 기능을 지원하지만 kwrite는 지원하지 않습니다.

관련 정보