如何让 bash 不包装输出?

Mih*_*aru 40 bash command-line

每当某些命令生成长行作为输出时(例如,当ls -l文件夹包含具有长名称的文件时),长行会换行到下一行,从而弄乱列结构。

有没有办法避免这种情况?类似于'nowrap' vim 选项的东西?


更新

我注意到接受的答案有一个问题:
如果我创建一个别名,例如:alias ll="tput rmam; ls -l; tput smam"
然后尝试 grep 它的输出:ll | grep foo
它仍然会打印所有文件,就像没有 grep 一样。

我找到的解决方案是在整个别名周围加上括号:
alias ll="(tput rmam; ls -l; tput smam)"

Gil*_*il' 30

请注意,这与 bash 无关(一旦您启动了命令,bash 就会等待它完成)以及与终端有关的一切。

默认情况下,大多数终端模拟器在右边距处换行。但是如果终端仿真器支持它,可以使用适当的控制序列来关闭它;然后长行被简单地截断:

printf '\033[?7l'
ls -l /a/folder/that/contains/files/with/long/names
printf '\033[?7h'
Run Code Online (Sandbox Code Playgroud)

  • 更便携:`tput rmam; ls -l 长名;tput smam` (17认同)
  • @Mihai:尝试使用 terminfo 文档(Linux 上的`man 5 terminfo`)。 (2认同)

Den*_*son 20

如果您希望能够进行水平滚动而不是截断行,请使用less -S.


Joh*_*n T 6

你可以使用这样的函数:

nowrap() 
{ 
   cut -c-$(tput cols); 
}
Run Code Online (Sandbox Code Playgroud)

请记住,尽管您必须为命令加上前缀nowrap或您命名函数的任何名称。


ogn*_*ten 5

您可以覆盖函数,以便它tput rmam在 grep 之前和tput smam之后自动运行:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}
Run Code Online (Sandbox Code Playgroud)

将其放入您的中.bash_profile,每当您运行时grep,它都会 grep 而不换行。

此内容已被大量编辑,向评论员致歉。


小智 5

使用 -S 开关将其传输到 less 命令:

ls -l | less -S
Run Code Online (Sandbox Code Playgroud)

然后您可以使用上/下/左/右箭头滚动并输入 q 退出。