背景
Ispell 是 linux 中一个基本的命令行拼写程序,我想调用它来获取以前收集的文件名列表。例如,这些文件名是从乳胶根文件中递归收集的。这在需要拼写所有递归包含的乳胶文件时很有用,而不是其他文件。但是,从命令行调用 ispell 并不是一件容易的事,因为 ispell 会给出“尚不能处理非交互式使用”形式的错误。在某些情况下。
(另一方面,理想情况下,我想使用 ProcessBuilder 类从 java 以编程方式调用 ispell,而不需要 bash。但是,同样的错误似乎困扰着这种方法。)
问题
为什么 ispell 给出错误“尚不能处理非交互式使用”。在某些情况下,当从涉及 read 方法的循环中调用 bash 时,而不是在其他情况下,如下面的代码示例所示?
下面的最小代码示例创建两个小文件(testFileOne.txt、testFileTwo.txt)和一个包含两个创建文件的路径的文件(testFilesListTemp.txt)。接下来,以三种不同的方式为 testFilesListTemp.txt 调用 ispell: 1. 在 "cat" 的帮助下 2. 首先将名称收集为字符串,然后遍历收集到的字符串中的子字符串,并为每个字符串调用 ispell他们。3. 通过直接循环testFilesListTemp.txt的内容,并为提取的路径调用 ispell。
对于某些原因,第三种方法不起作用,并产生错误“尚无法处理非交互式使用。”。为什么会发生这个错误,如何防止它,和/或是否有第三种方法的另一种变体可以在没有错误的情况下工作?
#!/bin/bash
#ispell ./testFiles/ispellTestFile1.txt
# Creating two small files and a file with file paths for testing
printf "file 1 contents" > testFileOne.txt
printf "file 2 contents. With a spelling eeeeror." > testFileTwo.txt
printf "./testFileOne.txt\n./testFileTwo.txt\n" > testFilesListTemp.txt
COLLECTED_LATEX_FILE_NAMES_FILE=testFilesListTemp.txt
# Approach 1: produce list of file names with cat and
# pass as argumentto ispell
# WORKS
ispell $(cat $COLLECTED_LATEX_FILE_NAMES_FILE)
# Second approach, first collecting file names as long string,
# then looping over substrings and calling ispell for each one of them
FILES=""
while read p; do
echo "read file $p"
FILES="$FILES $p"
done < $COLLECTED_LATEX_FILE_NAMES_FILE
printf "files list: $FILES\n"
for latexName in $FILES; do
echo "filename: $latexName"
ispell $latexName
done
# Third approach, not working
# ispell compmlains in this case about not working in non-interactive
# mode
#: "Can't deal with non-interactive use yet."
while read p; do
ispell "$p"
done < $COLLECTED_LATEX_FILE_NAMES_FILE