如何在zsh函数中获取ls输出到终端(非管道/文件)时的行数?
获取zsh中ls表格输出的终端行数
要解决这个问题,核心是让ls在管道中仍保持终端里的多列表格输出格式,再统计行数。以下是两种可行方法:
方法1:强制多列输出并指定终端宽度
ls默认在管道中切换为单列输出,用-C参数可强制多列,同时通过COLUMNS环境变量指定当前终端的实际宽度(确保输出格式和终端显示一致),再用wc -l统计行数:
# 获取当前终端宽度 local term_width=$(tput cols) # 生成表格格式输出并统计行数 local ls_table_lines=$(COLUMNS=$term_width ls -C | wc -l) echo "ls表格输出行数:$ls_table_lines"
解释:tput cols会读取当前终端的列数,COLUMNS=$term_width让ls按照终端实际宽度排版多列,这样输出的内容和你直接在终端敲ls的表格格式完全一致,wc -l就能得到正确的行数。
方法2:用伪终端模拟终端环境
借助script命令创建伪终端,让ls误以为在终端输出,从而保持表格格式:
Linux系统
local ls_table_lines=$(script -q -c "ls" /dev/null | wc -l) echo "ls表格输出行数:$ls_table_lines"
macOS系统
local ls_table_lines=$(script -q /dev/null ls | wc -l) echo "ls表格输出行数:$ls_table_lines"
解释:script会模拟一个完整的终端环境,ls在这种环境下会输出多列表格而非单列,后续的wc -l就能统计到终端显示的行数。注意不同系统的script参数略有差异。
内容的提问来源于stack exchange,提问作者Samsu
相关产品推荐
相关产品推荐

