gpt4 book ai didi

linux - 从脚本运行 ispell 时如何理解和避免非交互模式错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:57 24 4
gpt4 key购买 nike

背景

Ispell是linux中的一个基本的命令行拼写程序,我想调用它来获取以前收集的文件名列表。例如,这些文件名是从 latex 根文件中递归收集的。这在需要拼写所有递归包含的 latex 文件而不是其他文件时很有用。但是,事实证明,从命令行调用 ispell 并非易事,因为 ispell 会给出以下形式的错误 “还不能处理非交互使用。”在某些情况下。

(另一方面,理想情况下,我想使用 ProcessBuilder 类从 java 中以编程方式调用 ispell,而不需要 bash。然而,同样的错误似乎困扰着这种方法。)

问题

为什么 ispell 报错“还不能处理非交互式使用”。在某些情况下,当从涉及 read 方法的循环中调用 bash 时,但在其他情况下则不会,如以下代码示例所示?

下面的最小代码示例创建了两个小文件(testFileOne.txttestFileTwo.txt)和一个包含两个创建文件路径的文件(testFilesListTemp.txt)。接下来,以三种不同的方式为 testFilesListTemp.txt 调用 ispell: 1.借助“猫” 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

最佳答案

第三个例子不起作用,因为你重定向了标准输入。 ispell需要终端和用户交互。当您编写如下代码时:

while read p; do   
ispell "$p"
done < $COLLECTED_LATEX_FILE_NAMES_FILE

循环中任何程序从标准输入读取的所有内容都将从 $COLLECTED_LATEX_FILE_NAMES_FILE 中获取文件。 ispell检测到并拒绝操作。但是,您可以使用“描述重定向”来制作read p从文件中读取,ispell "$p"从“真实”终端读取。只是做:

exec 3<&0
while read p; do
ispell "$p" 0<&3
done < $COLLECTED_LATEX_FILE_NAMES_FILE

exec 3<&0 “复制”(保存)您的标准输入(0,“终端”)到描述符 3。稍后您将标准输入 (0) 重定向到 ispell从该描述符,通过键入 0<&3 (如果你愿意,你可以省略 0)。

关于linux - 从脚本运行 ispell 时如何理解和避免非交互模式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35063210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com