让管道中的程序认为它有 tty

让管道中的程序认为它有 tty

测试环境:

$ mkdir testdir
$ cd testdir
$ echo | tee "file 
name"

现在,ls将打印file?name(至少在 Ubuntu GNU bash 下),而将在单独的行中ls | cat打印file和。name

我想要实现的是,file?name使用管道版本进行打印,所以像

$ something ls | cat` or `ls | something | cat` or `ls | something cat

换句话说,如何欺骗像ls这里这样的命令,让其在 shell 中认为它有 TTY,而实际上却没有?

笔记: ls这里只是一个示例程序,我正在寻找通用解决方案,而不是像特定程序那样ls -q | cat

答案1

您可以使用socat模拟伪终端(pty):

socat - EXEC:'ls --color=auto',pty,setsid,ctty | cat

还有很多选择,查看其文档

ls默认情况下使用终端的宽度进行列输出。我还没有找到一种方法,如何在 socat pty 上设置它,解决方法是使用ls选项-w WIDTH

相关内容