在bash中自动截断长输出

时间:2019-03-19 21:32:28

标签: bash

是否可以在bash中自动截断长输出?

理想情况下,我想定义一个限制(例如MAXLINES),并将tail -n $MAXLINES自动应用于向终端输出多于MAXLINES行的每个命令(但显然在其他情况下(例如,管道)则不行)。

1 个答案:

答案 0 :(得分:2)

可以使用PROMPT_COMMAND

MAXLINES=10
tmp_out=/tmp/$$.output
PROMPT_COMMAND='touch "$tmp_out"; tail -n "$MAXLINES" "$tmp_out" >/dev/stdin; exec >"$tmp_out"'

工作原理

  • tmp_out=/tmp/$$.output临时文件,用于存储命令的输出
  • touch "$tmp_out":如果不存在则创建一个空文件,以使tail命令在第一次调用时不会失败
  • tail -n "$MAXLINE" "$tmp" > /dev/stdin:显示输出的前最大线数
  • exec > "$tmp_out":清除临时文件,并将当前进程输出(文件描述符1)重定向到该文件,以防stderr也可以重定向到另一个要被截断的文件(例如2> "$tmp_err")。 / li>

要运行命令而无需重定向

exec >/dev/stdin; ... the command

或({之后的空格很重要)

{ the command;}>/dev/stdin

要检索初始设置

unset PROMPT_COMMAND; exec >/dev/stdin