为何less命令在bash脚本函数或代码块中表现得像cat命令?
解决less在bash函数/代码块中通过tee后不分页的问题
问题根源
当less的标准输出被管道(比如| tee)接管时,它会检测到当前输出不是终端(TTY),自动切换到非交互模式,直接输出全部内容,表现得和cat一致。不管是在函数内还是{}代码块中,只要输出被重定向到管道而非终端,就会触发这个行为。
解决方案
让less直接输出到当前终端,绕过管道的影响。修改脚本如下:
#!/bin/bash tryit() { longfile=$(mktemp) /bin/ls -R /etc 2>/dev/null > "$longfile" # 将less的输出直接定向到终端,确保分页交互正常 less -R "$longfile" > /dev/tty # 清理临时文件 rm "$longfile" } { tryit } 2>&1 | tee SOME_LOGFILE
原理说明
通过> /dev/tty强制less的输出连接到当前终端,这样它会检测到终端环境,保持交互分页模式。而脚本中其他的输出(比如错误信息)依然会通过管道进入tee,同时写入日志文件和终端。
内容的提问来源于stack exchange,提问作者William Dickerson
相关产品推荐
相关产品推荐

