안녕하세요, 스크립트에서 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을 실행하려고 합니다.아니요루프가 작동하지만 이유를 모르겠습니다. 오랜만에 들어가니까 그런 것 같아요
답변1
파이프가 있기 때문에 표준 입력은 while
루프에서 실행되는 모든 명령을 포함하여 루프 로 리디렉션됩니다 vim
.
항상 터미널에서 입력을 받고 싶기 때문에 터미널에 다시 연결할 수 있습니다 /dev/tty
.
< /dev/tty vim -o "$student"
또는,표준 입력Pipe()를 입력하기 전에 파일 설명자에 저장 exec 6<&0
하고 Vim( <&6 vim -o ...
)에 전달할 수 있습니다. (또한 Vim 명령의 "매크로 기록"이 파일에 저장되어 있고 기록된 입력을 다시 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
답변2
]# cat filelist
fsc
out
]# vim -o $(<filelist)
2 files to edit
]#
...그리고 그 사이에 "fsc"와 "out"이라는 두 파일이 있습니다.쌓인윔에서.
나는 그것을 man vim
한 번 사용했다.
스크립트를 테스트한 후 xterm 창을 포기해야 했습니다. BS 키 이후에도 reset
"^H"만 실행할 수 있습니다 . 그래서 나는 완전히 변했다.
답변3
declare -a student_array=()
while read line ; do student_array+=("$line") ; done < <(echo -e "$student_array")
for student in "${student_array[@]}" ; do
vim -o $student
done