我试图对*.md
当前目录中的所有文件进行拼写检查,但以下命令失败:
>> find . -maxdepth 1 -name "*.md" | xargs -I {} aspell check {}
xargs: aspell: exited with status 255; aborting
我假设这是因为aspell
需要stdin
与用户交互但不知何故xargs
没有提供它。我找到了一个黑客攻击推特,
find . -maxdepth 1 -name "*.md" | xargs -n 1 xterm -e aspell check
但这每次都会打开一个新的 xterm。如何让原始命令像单独运行aspell
find 命令的结果一样工作?
答案1
xargs
你根本不需要,只需使用exec
选项:find . -maxdepth 1 -name "*.md" -exec aspell check {} \;
以防万一您或任何未来的读者确实需要使用
xargs
- 您可以通过生成新的 shell 并从终端 (/dev/tty
) 获取标准输入来做到这一点:find . -maxdepth 1 -name "*.sh" | xargs -n1 sh -c 'aspell check "$@" < /dev/tty' aspell
答案2
你总是可以只使用一个简单的循环:
for f in *.md; do aspell check "$f"; done
答案3
我同意,使用xargs
withfind
是多余的,但是如果输入来自其他东西而你有要使用xargs
,只需使用-o
:
grep -rl 'draft: false' | xargs -o -n1 aspell check --sug-mode=slow
man xargs
有这样说:
-o 在执行命令之前,在子进程中将 stdin 重新打开为 /dev/tty。如果您希望 xargs 运行交互式应用程序,这非常有用。