七个意外的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 I ran this at: 01/05/19 13:38:07 cat /etc/resolv.conf 1872 I ran this at: 01/05/19 13:38:19 curl bbc.co.uk 1873 I ran this at: 01/05/19 13:38:41 sudo vi /etc/resolv.conf 1874 I ran this at: 01/05/19 13:39:18 curl -vvv bbc.co.uk 1876 I ran this at: 01/05/19 13:39:25 sudo su - 

格式匹配人工日期中的字符。

3) CDPATH


为了节省命令行时间,可以使用此变量来更改目录,就像调用命令一样容易。

PATH一样, CDPATH变量是用冒号分隔的路径列表。 当您使用相对路径(即开头没有斜杠)运行cd时,默认情况下,外壳程序会在本地文件夹中查找相应的名称。 CDPATH将在您提供的路径中搜索您要去的目录。

如果您通过这种方式安装CDPATH

 $ CDPATH=/:/lib 

然后输入:

 $ cd /home $ cd tmp 

那么无论您/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变量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


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

如果在设置的秒数内未输入任何内容,则外壳退出。

也就是说,这是sleep 1 && exit的替代方法:

 $ TMOUT=1 

Source: https://habr.com/ru/post/zh-CN451492/


All Articles