Linux上有多种类型的环境变量。了解如何查看它们,为本地和远程登录创建它们,并使它们在重新启动后仍然有效。
启动终端窗口及其内部的shell时,会引用一组变量,以确保shell配置正确。这些变量还确保终端窗口和shell可能需要引用的任何信息都可用。总的来说,这些变量保存的设置定义了在终端窗口中找到的环境,一直到命令提示符的外观。所以,自然地,它们被称为环境变量。
一些环境变量是系统范围的,或者是全局的。其他人是全会,只能由你看到。其他人无法引用您的会话环境变量。在shell中定义了第三组环境变量。您的区域设置、时区和键盘设置、shell尝试查找命令时搜索的目录集以及默认编辑器都存储在shell环境变量中。
我们将向您展示如何查看系统中存在的环境变量,并描述如何创建自己的环境变量。我们还将向您展示如何使它们对子进程可用,以及如何在重新启动时保持持久性。
当shell启动时,它会经历一个初始化阶段。此时,它读取定义shell环境的环境变量。
当程序或命令从称为子进程的shell启动时,它会继承父进程的环境,但请注意!我们将看到,您可以创建不添加到环境中的变量,这样子进程就不会继承这些变量。
如果子进程是一个shell,则该shell将从它自己的、新的变量集进行初始化。因此,如果在当前shell中更改命令提示符,然后启动子shell,子shell将不会继承父shell修改后的命令提示符。
按照惯例,环境变量的名称是大写的。以下是一些全局环境变量及其包含的值所代表的内容:
相关:如何在Linux上使用pushd和popd
我们可以看到其中一些设置使用的是echo,它将值写入终端窗口。要查看环境变量所包含的值,需要在其名称的开头添加美元符号($)。
很好的一点是,您可以使用tab completion为您填写环境变量名称。键入几个字母的名字和点击标签。变量的名称由shell完成。如果没有发生这种情况,则需要再键入几个字母,以便将环境变量与名称以相同字母开头的其他命令区分开来:
echo $SHELL echo $LANG echo $HOME echo $PWD要创建自己的全局环境变量,请将它们添加到/etc/environment文件中。您需要使用sudo来编辑此文件:
sudo gedit /etc/environment要添加环境变量,请键入其名称、等号(=)和希望环境变量保持的值。在等号(=)前后不要空格。环境变量的名称可以包含字母、下划线(\)或数字。但是,名称的第一个字符不能是数字。
如果值中有空格,请确保将整个值用引号(“)括起来。
保存文件,然后注销并重新登录。使用echo测试是否存在新变量并保存您设置的值:
echo $WEBSITE因为它是一个全局环境变量,每个人都可以使用,所以用户mary可以在下次登录时引用该环境变量:
echo $WEBSITE要同时查看所有环境变量,请键入printenv。有很多输出,所以通过管道将其排序,然后将其转换为更少的输出是有意义的:
printenv | sort | less环境变量的排序列表以较少的格式显示。
我们可以通过grep管道输出与特定主题相关的环境变量。
printenv | grep GNOME相关:如何使用gedit在Linux上以图形方式编辑文本文件
这些是bash中用于指示或记录其行为和功能的一些shell环境变量。使用终端时会更新某些值。例如,COLUMNS环境变量将更新以反映您可能对终端窗口宽度所做的更改:
相关:如何在Linux上使用pushd和popd
让我们检查几个shell变量:
echo $BASH_VERSION echo $HOSTNAME echo $COLUMNS echo $HISTFILESIZE echo $UID为完整起见,以下是可以在命令提示定义中使用的标记:
您将在.bashrc文件中找到PS1环境变量的定义。
要创建供自己使用的环境变量,请将它们添加到.bashrc文件的底部。如果您想让环境变量可用于远程会话,例如SSH连接,那么还需要将它们添加到.bash\u概要文件中。
两个文件的环境变量定义格式相同。要向.bash\u配置文件添加定义,请在主目录中键入以下内容:
gedit .bashrc我们添加了一个名为INHERITED\u VAR的环境变量。请注意行开头的单词“export”。
完成编辑后保存并关闭文件。您可以注销并重新登录,也可以使用点命令(.)使shell重新读取.bash\u概要文件,如下所示:
. .bashrc现在,让我们在命令行上创建一个环境变量:
LOCAL_VAR="This session only"如果我们使用echo,我们可以看到两个环境变量都可以访问:
echo $LOCAL_VAR echo $INHERITED_VAR您将注意到,继承的\u VAR环境变量的定义在行的开头有“export”一词。这意味着环境变量将由当前shell的子进程继承。如果我们使用bash命令启动另一个变量,我们可以从子shell内部再次检查这两个变量:
bash echo $LOCAL_VAR echo $INHERITED_VAR如您所见,继承的\u VAR可以在子shell中访问,但是本地\u VAR不能访问。我们只得到一个空行。
虽然“export”将环境变量部分添加到子进程继承的环境中,但继承的\u VAR不是全局环境变量。例如,用户mary不能引用它:
echo $INHERITED_VAR要关闭child bash会话,请使用exit:
exit继承的环境也会影响脚本。下面是一个简单的脚本,它将三个环境变量的值写入终端窗口:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR这被保存到一个名为环境测试.sh,然后使用以下命令使其可执行:
chmod +x envtest.sh当我们运行脚本时,它可以访问三个环境变量中的两个:
./envtest.sh脚本可以看到网站全局环境变量和继承的导出的环境变量。即使脚本在创建变量的同一shell中运行,它也无法访问本地变量。
如果需要,我们可以从命令行导出环境变量。我们将对本地的\u VAR执行此操作,然后再次运行脚本:
export LOCAL_VAR ./envtest.sh环境变量已添加到当前shell的环境中,因此它出现在脚本继承的环境中。脚本也可以引用该环境变量。
远程登录会话可以访问全局环境变量,但是如果您希望本地定义的环境变量可以远程使用,则必须将它们添加到.bash\u概要文件中。可以在.bashrc和.bash\u概要文件中使用不同的值设置相同的环境变量。这可以通过一个脚本来实现,比如说,为本地或远程使用系统的用户修改它的行为。
(冒着混淆问题的风险,还有一个.profile文件。它也可以保存环境变量定义。但是,如果存在.bash\u概要文件,则不会读取.profile文件。因此,最安全的方法和bash兼容的方法是使用.bash\u概要文件。)
要编辑.bash\u配置文件,我们将再次使用gedit:
gedit .bash_profile我们将添加相同的环境变量和之前使用的值。
保存更改并关闭gedit。
在另一台计算机上,我们将与测试计算机建立SSH连接。
ssh [email protected]连接后,我们将再次运行脚本:
./envtest.sh作为远程登录初始化的一部分,.bash\u概要文件已经被读取,我们和脚本都可以访问继承的\u VAR环境变量。
要取消设置环境变量,请使用unset命令。如果我们取消设置全局环境变量WEBSITE和导出的环境变量INHERITED\u VAR,它们将不再在命令行或子进程中可用:
unset WEBSITE unset INHERITED_VAR ./envtest.sh echo $WEBSITE需要注意的是,这只会在本次会话中更改全局环境变量的可用性。另一个同时登录的人仍然可以访问该全局环境变量的实例。他的实例在登录过程中被初始化并从/etc/environment文件中读取,并且独立于其他任何人的变量副本。
例如,用户mary仍然可以访问WEBSITE环境变量并读取其值,即使用户dave已在其会话中取消设置该变量:
echo $WEBSITE环境变量可以用来让脚本和应用程序知道它们应该如何工作。它们可用于存储设置或少量数据。例如,脚本可以使用其他脚本可以引用的值填充环境,而无需将它们写入文件。
...更多的特性。了解更多关于Bash-on-Windows的信息,从您应该如何以及为什么安装它,到您可能不知道的隐藏特性。 ...
...为输入运行它。这些特殊的应用程序被称为水滴。下面是如何创建一个: ...
... 如何在windows10上安装linux bash shell ...
... 第一行告诉运行这个程序的人如何运行它(即使用bash解释器)。第二个命令与您在命令行中输入的任何其他命令一样。将该文件另存为hello_世界.sh,然后: ...
...改其目录,您可以控制他们可以访问哪些命令。下面介绍如何在Linux上设置受限shell。 受限炮弹 受限shell不是另一个shell。这是标准外壳的另一种模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下启动。在本文中,我们将...
Bash不是唯一的Linux shell。很容易尝试其他的shell,比如非常流行的Zsh。找到一个您喜欢的shell后,使用chsh命令将其设置为默认shell。我们会教你怎么做。 为什么贝壳很重要 shell位于您和操作系统之间。它在终端窗口内提供环境...
...小又简单。 在使用Linux计算机的第一个小时内,您将学习如何使用Bash和其他shell附带的cd命令。也许您以前有在其他操作系统上使用它的经验,不需要解释。它会改变当前的工作目录,对吗?还有什么要知道的? 好吧,比你想象...
...在shell中的,因此Bash不必费劲地查找这些命令。 但是Bash如何定位其他命令、程序和外部独立二进制文件呢?Bash使用路径,实际上是一组路径,每个路径指向一个目录。然后,它在每个目录中搜索与您试图运行的命令或程序匹配...
...给它: drink_of-the_Year="$my_boost $this_year" echo drink_of_the-Year 如何在脚本中使用变量 如果没有变量,脚本将完全无法运行。变量提供了灵活性,使脚本成为通用的解决方案,而不是特定的解决方案。为了说明这一区别,这里有一个...
...法是安装足够的操作系统,以完成所需的任务。通过查看如何使用chroot环境来回答“what is required”问题。 一些常见用途是: 软件开发和产品验证。开发人员编写软件,产品验证团队(PV)对其进行测试。有时PV发现的问题无法...