在bash中自动截断长输出
是否可以在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 >
理想情况下,我希望定义一个限制,比如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那样逐行显示一个文件