使用管道+Xargs传文件列表给Emacs报错:standard input is not a tty
解决Emacs通过xargs调用时“standard input is not a tty”的问题
这个问题的核心原因是xargs默认不会将执行的命令连接到当前终端的tty,而终端版Emacs需要依赖tty来处理交互输入,所以当xargs启动Emacs时,Emacs的标准输入不是tty,就会抛出这个错误。而你手动复制xargs打印的命令运行时,命令直接绑定当前终端的tty,所以能正常工作。
下面是几种可行的解决方法:
方法一:使用xargs的-o(或--open-tty)选项
很多现代版本的xargs支持-o选项,它会让xargs为执行的命令打开一个新的tty,确保Emacs能获取到终端输入:
ack findit -l | xargs -o emacs
这个选项是最直接的解决方案,完美适配你的原有命令结构。
方法二:用shell循环替代xargs
如果你的系统xargs没有-o选项(比如一些老旧的UNIX系统),可以用shell循环来逐个打开文件,这样每个Emacs进程都会直接关联当前终端的tty:
基础版(适合无空格的文件名)
for file in $(ack findit -l); do emacs "$file" done
健壮版(支持带空格/特殊字符的文件名)
如果需要处理包含空格或特殊字符的文件名,建议用while循环读取ack的输出,避免文件名被错误拆分:
ack findit -l | while IFS= read -r file; do emacs "$file" done
方法三:直接通过命令行参数传递文件(适合文件数量不多的情况)
如果ack返回的文件数量不多,不会超过系统的命令行长度限制,也可以直接把结果作为参数传给Emacs,跳过xargs:
emacs $(ack findit -l)
这种方式下Emacs直接关联当前终端,自然不会有tty的问题。
内容的提问来源于stack exchange,提问作者Ray Salemi
相关产品推荐
相关产品推荐

