从 bash 脚本中引用 shell 变量 $COLUMNS

Ran*_*ndy 6 shell shell-script

这在 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)
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 8

庆典套shell变量COLUMNSLINES互动模式(有过与它的问题checkwinsize功能而导致这种区别)。您可以通过不同的方式获取这些信息。

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

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

  • tput cols首先尝试环境变量(因为它们未在您的环境中设置,所以也一样),然后尝试系统的终端设置,然后是终端描述。不再在终端描述中输入大小;它是 termcap 应用程序(例如 bash)使用的拐杖。你只会得到一个数字,例如,

    40

    由于历史故障,在 FreeBSD 系统上(请参阅历史可移植性说明),您必须使用tput co,因为(尽管使用带有 terminfo 的 ncurses 作为系统库),ncurses'tput不用于 FreeBSD。当然,NetBSD 和 OpenBSD 转向了其他切线。

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

    40 80

  • resize尝试终端本身(使用转义序列)并更新终端设置以匹配。对于 bash,您将使用resize -u,给出如下输出:

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

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


Ipo*_*cer 5

COLUMNS=$(tput cols)
Run Code Online (Sandbox Code Playgroud)

或者在一行中

sha512sum <filename> | cut -c -"$(tput cols)"
Run Code Online (Sandbox Code Playgroud)