스크립트 내에서 어떻게 vim을 열 수 있습니까?
코딩 과제를 채점하고 코드와 메모 파일을 열기위한 스크립트를 작성해야하는데 vim이 열리지 않습니다.
스크립트는 본질적으로 이것의 더 멋진 버전입니다.
#!/bin/bash
echo -e "$student_files" | while read student do
vim -o $student
done
#each "$student" looks like: "file1 file2 [...] notes"
그러나 vim은 다음에 대해 불평합니다.
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
왜 이런 일이 일어나고 어떻게 해결할 수 있는지 말해 줄 수 있습니까? 미리 감사드립니다 :)
참고 : 루프 없이 스크립트에서 vim을 실행 해 보았지만 작동하는 이유를 모르겠습니다. 내가 파이핑하고 있기 때문에 그럴 것 같아요
파이프 라인 때문에 표준 입력은 while
루프에 대해 리디렉션됩니다 . 여기에는 vim
.
항상 터미널에서 입력을 받고 싶기 때문에 터미널에 다시 연결하면됩니다 /dev/tty
.
< /dev/tty vim -o "$student"
또는 파이프 라인 ( ) 으로 이동하기 전에 stdin을 파일 설명자에 저장 exec 6<&0
하고 Vim ( <&6 vim -o ...
)에 전달할 수 있습니다. (이것은 또한 Vim 명령의 "매크로 기록"이 파일에 저장되고 기록 된 입력을 다시 파이핑하여 Vim 자체를 자동화하려는 경우를 처리합니다.)
또는 먼저 전체 파일 내용을 Bash 배열 ( readarray
) 로 읽은 다음 간단한 for
루프 를 사용하여 파이프 라인을 완전히 제거 할 수 있습니다. 이것은 더 많은 메모리를 소비하지만, 제한 요인이 아니라 순차적으로 처리 할 Vim 세션 수입니다 .-) 실제로 여기에서 파일을 읽는 것이 아니라 변수에서 읽는 것이기 때문에 문제가되지 않습니다. 내용 (내가 이해하는 바와 같이 잠재적으로 여러 줄에 공백으로 구분 된 학생이 있음-기본 IFS
구문 분석은 개별 학생으로 분할합니다) 따라서 필요한 것은 Bash 배열로 간단한 단어 분할입니다 .
declare -a students=($student_files)
for student in "${students[@]}"
do
vim -o "$student"
done
또는 중간 배열을 완전히 건너 뜁니다.
for student in $student_files
do
vim -o "$student"
done
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다