从 bash 脚本内部引用 shell 变量 $COLUMNS

从 bash 脚本内部引用 shell 变量 $COLUMNS

这在 xterm: 中按预期运行sha512sum <filename> | cut -c -$COLUMNS,但不在#! /bin/bash诸如 之类的脚本中运行dothis.sh <args>,因为$COLUMNS可以这么说,因为未知。

我宁愿不将 $COLUMNS 作为参数传递,也不会将其导出到环境中。

该脚本并不重要,只需在一台机器上的 xterm 命令行上运行。

Linux pre 3.2.0-4-amd64 #1 SMP Debian 3.2.81-2 x86_64 GNU/Linux
GNU bash, version 4.2.37
XTerm(278)

答案1

bash 设置 shell 变量COLUMNSLINES交互的模式(其存在问题检查尺寸导致这种区别的特征)。您可以通过不同的方式获取该信息。

从问题的上下文来看,您知道如何制作 shell 脚本,但不确定从哪里获取有用的数据。

在我的窗口中,我有 40 行,80 列:

  • tput cols首先尝试环境变量(因为它们没有在您的环境中设置,这也没关系),然后尝试系统的终端设置,然后尝试终端描述。将尺寸放入终端描述中已经不再需要做太多事情了;它是 termcap 应用程序(例如 bash)使用的拐杖。您只会得到一个数字,例如,

    40

    由于历史故障,在 FreeBSD 系统上(请参阅历史可移植性注释),你必须使用tput co,因为(虽然使用ncurses with terminfo作为系统库),ncurses'tput不与 FreeBSD 一起使用。当然,NetBSD 和 OpenBSD 偏离了其他方向。

  • stty size(在许多平台上可用)给出终端设置中的行/列值 - 如果这些值不可用,则什么也不提供。它只给出两个数字,可以在 shell 中轻松拆分:

    40 80

  • resize尝试终端本身(使用转义序列)并更新终端设置以匹配。对于 bash,你可以使用resize -u,给出这样的输出:

    列=80;
    行=40;
    导出列线;

这些选择都没有多大用处,cron因为不涉及终端。但它们都可以在终端中使用。

答案2

COLUMNS=$(tput cols)

或者在一行中

sha512sum <filename> | cut -c -"$(tput cols)"

相关内容