Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中自动截断长输出_Bash - Fatal编程技术网

在bash中自动截断长输出

在bash中自动截断长输出,bash,Bash,是否可以在bash中自动截断长输出 理想情况下,我希望定义一个限制,比如MAXLINES,并自动将tail-n$MAXLINES应用到每个向终端输出超过MAXLINES行的命令(但在其他上下文中,例如管道,显然不适用)。可以使用提示符\u命令来完成 MAXLINES=10 tmp_out=/tmp/$$.output PROMPT_COMMAND='touch "$tmp_out"; tail -n "$MAXLINES" "$tmp_out" >/dev/stdin; exec >

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


理想情况下,我希望定义一个限制,比如MAXLINES,并自动将
tail-n$MAXLINES
应用到每个向终端输出超过MAXLINES行的命令(但在其他上下文中,例如管道,显然不适用)。

可以使用
提示符\u命令来完成

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

  • tmp\u out=/tmp/$$.output
    用于存储命令输出的临时文件
  • 触摸“$tmp\u out”
    :如果不存在,则创建空文件,以便tail命令在第一次调用时不会失败
  • tail-n“$MAXLINE”“$tmp”>/dev/stdin
    :显示输出的第一条MAXLINE
  • exec>“$tmp\u out”
    :清除临时文件并将当前进程输出(文件描述符1)重定向到此文件,以防stderr也可以重定向到另一个要截断的文件(例如
    2>“$tmp\u err”
在不重定向的情况下运行命令

exec >/dev/stdin; ... the command
或(
{
后面的空格很重要)

检索初始设置的步骤

unset PROMPT_COMMAND; exec >/dev/stdin

可以使用
PROMPT\u命令来完成

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

  • tmp\u out=/tmp/$$.output
    用于存储命令输出的临时文件
  • 触摸“$tmp\u out”
    :如果不存在,则创建空文件,以便tail命令在第一次调用时不会失败
  • tail-n“$MAXLINE”“$tmp”>/dev/stdin
    :显示输出的第一条MAXLINE
  • exec>“$tmp\u out”
    :清除临时文件并将当前进程输出(文件描述符1)重定向到此文件,以防stderr也可以重定向到另一个要截断的文件(例如
    2>“$tmp\u err”
在不重定向的情况下运行命令

exec >/dev/stdin; ... the command
或(
{
后面的空格很重要)

检索初始设置的步骤

unset PROMPT_COMMAND; exec >/dev/stdin

你可能首先想用
bash
打开一个新的shell。当你想要正常输出时,你可以
退出
@Nahuel:非常好。但是,当你说
ls-la | less
时,长输出也会被截断,因为less不知道它应该输出到终端。你知道如何避免这种情况吗?确实是因为tail是在命令在提示符下完成后完成的,因此使用tty的程序不能交互地工作以恢复输出,可以执行以下操作
exec>/dev/stdin;ls-la | less
注意,当输出为tty或文件(例如带有转义序列)时,
ls
之类的一些程序的行为也不同,比较
touch'$'\033''[31mhello'$'\033''[0m'
ls*hello*
ls*hello*>/dev/stdin
,同样
ls-a
在tty中会以列的形式显示文件名,而在文件中会像
ls-a1
那样逐行显示一个文件,您可能首先想用
bash
打开一个新的shell。当您想要正常输出时,您可以
退出
@Nahuel>:非常好。但是,例如,当你说
ls-la | less
时,长输出也会被截断,因为less不知道它应该输出到终端。你知道如何避免这种情况吗?确实,因为尾部是在命令在提示符中完成后完成的,所以使用tty的程序无法交互地恢复输出foll可以执行以下操作:
exec>/dev/stdin;ls-la | less
注意,当输出为tty或文件(例如带有转义序列)时,
touch'$'\033'[31mhello'$'\033''比较
tty中的[0m'
ls*hello*
ls*hello*>/dev/stdin
,以及
ls-a
将在列中显示文件名,而在文件中则会像
ls-a1那样逐行显示一个文件