继续关于
鲜为人知的 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