七个意想不到的 Bash 变量

继续一系列笔记 鲜为人知的 职能 bash,我将向您展示七个您可能不知道的变量。

1) PROMPT_COMMAND

您可能已经知道如何操作提示符来显示各种有用的信息,但并不是每个人都知道每次显示提示符时都可以运行 shell 命令。

事实上,许多复杂的提示操纵器使用此变量来执行命令来收集提示中显示的信息。

尝试在新的 shell 中运行它,看看会话会发生什么:

$ PROMPT_COMMAND='echo -n "writing the prompt at " && date'

2) HISTTIMEFORMAT

如果你跑 history 在控制台中,您将收到之前在您的帐户下执行的命令列表。

$ HISTTIMEFORMAT='I ran this at: %d/%m/%y %T '

设置此变量后,新条目会记录时间和命令,因此输出将如下所示:

第1871章 我在以下位置运行: 01/05/19 13:38:07 cat /etc/resolv.conf 第1872章 我在以下位置运行: 01/05/19 13:38:19curl bbc.co.uk 第1873章 我在以下位置运行: : 01/05/19 13:38:41 sudo vi /etc/resolv.conf 1874 我在以下位置运行: 01/05/19 13:39:18 curl -vvv bbc.co.uk 1876 我在以下位置运行: 01 /05/19 13:39:25 sudo su -

格式匹配来自的字符 man date.

3) CDPATH

为了节省命令行时间,您可以使用此变量像发出命令一样轻松地更改目录。

喜欢 PATH, 多变的 CDPATH 是一个以冒号分隔的路径列表。 当您运行命令时 cd 使用相对路径(即没有前导斜杠),默认情况下 shell 在本地文件夹中查找匹配的名称。 CDPATH 将在您提供的路径中搜索您想要访问的目录。

如果你安装 CDPATH 这样:

$ CDPATH=/:/lib

然后输入:

$ cd /home
$ cd tmp

那么你总是会陷入 /tmp 不管你在哪。

但是,请小心,因为如果您没有在列表中指定本地的(.) 文件夹,那么您将无法创建任何其他文件夹 tmp 并像往常一样去它:

$ cd /home
$ mkdir tmp
$ cd tmp
$ pwd
/tmp

糟糕!

这类似于当我意识到本地文件夹没有包含在更熟悉的变量中时所感到的困惑 PATH...但是您必须在 PATH 变量中执行此操作,因为您可能会被欺骗从某些下载的代码中运行虚假命令。

我的是由起点设置的:

CDPATH=.:/space:/etc:/var/lib:/usr/share:/opt

4) SHLVL

你有没有想过,打字 exit 它会将您从当前的 bash shell 带到另一个“父”shell,还是会完全关闭控制台窗口?

该变量跟踪您在 bash shell 中的嵌套深度。 如果您创建一个新终端,则将其设置为 1:

$ echo $SHLVL
1

然后,如果启动另一个 shell 进程,数量会增加:

$ bash
$ echo $SHLVL
2

这在您不确定是否退出或跟踪嵌套位置的脚本中非常有用。

5) LINENO

该变量对于分析当前状态和调试也很有用 LINENO,报告迄今为止在会话中执行的命令数:

$ bash
$ echo $LINENO
1
$ echo $LINENO
2

这在调试脚本时最常使用。 插入像这样的行 echo DEBUG:$LINENO,您可以快速确定您位于(或不在)脚本中的位置。

6) REPLY

如果你像我一样通常编写这样的代码:

$ read input
echo do something with $input

令人惊讶的是您根本不需要担心创建变量:

$ read
echo do something with $REPLY

这做同样的事情。

7) TMOUT

为了避免出于安全原因在生产服务器上停留太长时间或意外地在错误的终端中运行危险的东西,设置此变量可以起到保护作用。

如果在设定的秒数内没有输入任何内容,shell 就会退出。

也就是说,这是一个替代方案 sleep 1 && exit:

$ TMOUT=1

来源: habr.com

添加评论