如何使bash不包装输出?


33

每当任何命令生成长行作为输出时(例如,当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)"



Answers:


27

请注意,这与bash(一旦启动命令,bash等待它完成)无关,并且与终端无关。

大多数终端仿真器默认情况下以正确的边距换行。但是,如果终端仿真器支持,可以使用适当的控制序列将其关闭;那么长行将被截断:

printf '\033[?7l'
ls -l /a/folder/that/contains/files/with/long/names
printf '\033[?7h'

是的,这就是我想要的,谢谢吉尔斯!
Mihai Rotaru 2010年

12
更便于携带:tput rmam; ls -l longname; tput smam
暂停,直到另行通知。

更好 但是[rs]妈妈是哪里人呢?我搜索了tput和termcap手册,但找不到任何有关它们的信息?
Mihai Rotaru 2010年

2
@Mihai:试试terminfo文档(man 5 terminfo在Linux上)。
吉尔(Gilles)“所以,别再邪恶了”,2010年

的确存在
Mihai Rotaru 2010年


5

您可以使用如下功能:

nowrap() 
{ 
   cut -c-$(tput cols); 
}

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


它有效,但是我失去了颜色编码;还有什么保存方法吗?
Mihai Rotaru 2010年

3

您可以覆盖一个函数,以使其tput rmam在grep之前和tput smam之后自动运行:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

将其放到您的计算机中.bash_profile,无论何时运行grep,它都会自动换行,而无需换行。

这已经过大量编辑,对评论员表示歉意。


sleep 20令人惊叹的是:-)
Ciro Santilli新疆改造中心法轮功六四事件

2

使用-S开关将其传递给less命令:

ls -l | less -S

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.