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

hyd*_*yde 24 shell pipe tty

测试环境:

$ mkdir testdir
$ cd testdir
$ echo | tee "file 
name"
Run Code Online (Sandbox Code Playgroud)

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

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

$ something ls | cat` or `ls | something | cat` or `ls | something cat
Run Code Online (Sandbox Code Playgroud)

换句话说,如何让像ls这里这样的命令陷入思考,它有一个 TTY,当它没有时,在 shell 中?

注意: ls这里只是一个示例程序,我正在寻找通用解决方案,而不是特定于程序的解决方案ls -q | cat

jof*_*fel 21

你可以socat用来模拟一个伪终端(pty):

socat - EXEC:'ls --color=auto',pty,setsid,ctty | cat
Run Code Online (Sandbox Code Playgroud)

还有更多选项,请参阅其文档

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