我很难理解有关 Linux 的一些基本概念。以及一些变量对这些概念的影响。
这些基本概念是虚拟环境、shell、tty。
变量:$PS1 $LANG
命令:
导出(将变量从一个 shell 导出到另一个 shell?这也适用于 tty 和虚拟环境吗?如果我在 Ubuntu(tty?终端?)中打开一个新标签,它不会导出到另一个?
环境-i?
我认为所有这些问题都与我对 shell、虚拟环境和 tty 的基本理解有关。
目前情况不太好。
所以我希望有人能好心地向我解释这一点?
答案1
这壳是命令行解释器,它将用户输入的命令转换为操作系统要执行的操作。shell 可以以交互方式启动(用户可以键入和执行命令),也可以以非交互方式启动(通过脚本或程序分叉,例如定时任务, ETC。)。
交互式 shell 在终端仿真器中启动,它将 GUI 应用程序称为 gnome 终端,终端等,或者在 TTY(指虚拟文本控制台)内。TTY 可通过组合键访问Ctrl Alt F1-9。在 Linux 的桌面发行版中,桌面环境在其中一个 TTY 内运行。
参考:
不管它是终端仿真器还是 TTY,您都可以使用其中运行的 shell 执行相同的操作。
Ubuntu 中的默认用户 shell 是猛击。有一个名为.bashrc
位于用户主目录中。此文件(以及一些其他系统初始化文件/etc/bash.bashrc
)是来源当用户打开一个新的交互式 shell 时。这样就创建了用户的默认环境。
从字面上理解,通过获取.bashrc
某些环境变量可以得到某些值。这些环境变量包括:
$PATH
其中包含可以找到可执行文件的系统路径(以列分隔),$PS1
决定你的提示是什么样的,例如:用户@主机:/当前/目录$,$LANG
设置默认语言环境,或$LC_ALL
覆盖所有语言环境设置(来源有关此解释的更多信息,请阅读man locale
)。
因此,如果您想永久更改某个环境变量(在用户的 Bash shell 中),您可以在 中修改(或设置)其值.bashrc
。否则,更改仅对 shell 的当前实例有效。
例如,打开一个新终端并输入PS1='prompt_changed->'
,您的提示将更改为该字符串。然后保持该终端窗口打开并打开一个新终端 - 您将看到此更改未在那里应用。要恢复第一个终端,您可以.bashrc
通过命令手动获取文件. ~/.bashrc
。
当你使用该export
命令时,你将一个变量导出到子壳层这些 shell 是从当前 shell(子 shell)派生出来的,而不是从当前 shell 的父进程创建的其他 shell(兄弟 shell)派生出来的。下面是一个例子:
user@host:~$ VAR='Hello!' # Define a variable called VAR
user@host:~$ echo $VAR # Output the value of the variable
Hello!
user@host:~$ export VAR # Export the variable
user@host:~$ bash # Fork new bash shell
user@host:~$ echo $VAR # Output the value of the exported variable
Hello!
user@host:~$ exit # Exit to the parent shell
user@host:~$ sh # Fork new sh (dash) shell
$ echo $VAR # Output the value of the exported variable
Hello!
该命令env
用于更改命令或脚本执行的环境。以下是几行man env
:
env
- 设置命令调用的环境。env
实用程序应获取当前环境,根据其参数对其进行修改,然后使用修改后的环境调用实用程序操作数命名的实用程序。
-i
使用参数指定的环境来调用实用程序;继承的环境应被完全忽略。以下命令:使用新值作为其环境中的唯一条目来
env -i PATH=/mybin mygrep xyz myfile
调用命令。在这种情况下,用于定位,然后它必须位于中。mygrep
PATH
PATH
mygrep
/mybin
env
通常用在脚本的开头(在所谓的 shebang 内)以提高其可移植性。以下两个主题涵盖了此用法:
当不带参数运行时,该env
命令会输出环境变量的列表。
再次,.bashrc
主目录中的文件定制了 shell 的功能,例如创建或修改变量和别名以及定义函数。
例如,让我们在文件底部定义以下函数.bashrc
。
hello() { echo "Hello, ${USER^}!"; }
保存文件后,您可以获取它或打开一个新的终端实例并输入hello
。
spas@host:~$ hello
Hello, Spas!
因此,我们可以看到此函数(或变量或别名)在当前 shell 中可用。此时它被调用当地的函数(或变量或别名),所以如果我们通过函数检查环境,env | grep hello
就不会存在。局部变量仅存在于当前 shell 中,不能影响其他命令或应用程序。
在定义一个函数(变量、别名)之后,.bashrc
我们可以将其导出,以便从当前 shell 分叉出来的子 shell(命令或脚本)可以使用它 - 因此它变成全球的或者环境函数(变量,别名)。
hello() { echo "Hello, ${USER^}!"; }
export -f hello
spas@host:~$ source ~/.bashrc # in bash 'source' is synopsis to '.'
spas@host:~$ env | grep 'hello' # parse 'hello' within the output of 'env'
BASH_FUNC_hello%%=() { echo "Hello, ${USER^}!"
spas@host:~$ bash -c 'hello' # fork an non interactive sub shell
Hello, Spas! # and execute the function inside
请记住,非交互式 shell 在大多数情况下不会默认提供初始化文件.bashrc
,因此它们的环境比交互式 shell 的环境更有限。
例如,当你设计一个脚本,它将被定时任务您必须使用命令的完整路径或确保它具有必要的环境。