a;#123;PS1-&a;#125;&l;/span&g;&a;quot;&l;/span&g; ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g; [ &l;span class=\&q;string\&q;&g;&a;quot;${BASH-}\&q; ] &a;&a; [ \&q;$BASH&a;quot;&l;/span&g; != &l;span class=\&q;string\&q;&g;&a;quot;/bin/sh&a;quot;&l;/span&g; ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;# The file bash.bashrc already sets the default PS1.&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;# PS1=&a;#x27;\\h:\\w\\$ &a;#x27;&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g; [ -f /etc/bash.bashrc ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; . /etc/bash.bashrc&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;else&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g; [ &l;span class=\&q;string\&q;&g;&a;quot;&l;span class=\&q;subst\&q;&g;$(id -u)&l;/span&g;&a;quot;&l;/span&g; -eq 0 ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; PS1=&l;span class=\&q;string\&q;&g;&a;#x27;# &a;#x27;&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;else&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; PS1=&l;span class=\&q;string\&q;&g;&a;#x27;$ &a;#x27;&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;这段默认脚本首先通过if [ “$(id -u)” -eq 0 ]; then判断当前用户是否为root用户。如果是root用户,则将PATH设置为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,否则将PATH设置为/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games。&l;/p&g;\n&l;p&g;接下来,判断命令行提示符PS1(Prompt String 1)是否已经被设置。如果已经设置,则检查当前Shell是否为Bash,并且不是以/bin/sh作为Bash解释器。如果是这样,则不修改PS1,并且尝试加载/etc/bash.bashrc文件。如果/etc/bash.bashrc存在,则将其包含到当前Shell配置中。&l;/p&g;\n&l;p&g;如果PS1未被设置,则根据当前用户是否为root用户,设置PS1为’# ‘(root用户)或’$ &s;(非root用户),用作命令行提示符。&l;/p&g;\n&l;p&g;最后,检查是否存在&l;code&g;/etc/profile.d&l;/code&g;目录。如果存在,则遍历该目录下的所有.sh文件,并加载每个文件中的配置。&l;/p&g;\n&l;h2 id=\&q;shell-分类\&q;&g;Shell 分类&l;a title=\&q;#shell-分类\&q; href=\&q;#shell-分类\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;以上是按照Shell的不同实现特点和变体版本能分得到 Bourne Shell(sh), Bourne compatible shells(bash, zsh, ash…)&l;/p&g;\n&l;p&g;按是否登录和交互又能分为:&l;br&g;\n登陆的维度划分:login shell , non-login shell&l;br&g;\n交互的维度划分:interactive shell , non-interactive shell&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;login shell&l;/code&g;: 需要用户名、密码登录后才能进入的shell。在大多数情况下 ,远程终端工具(secureCRT xshell putty)通过ssh连接都是login shell&l;/li&g;\n&l;li&g;&l;code&g;non-login shell&l;/code&g;: 一般是在图形界面中启动一个终端shell 或者在login shell终端输入shell对应路径会打开一个临时shell&l;/li&g;\n&l;/ul&g;\n&l;p&g;通过&l;code&g;su username&l;/code&g; 切换到用户得到一个non-login shell; &l;code&g;su - username&l;/code&g; 切换可以获得一个login shell&l;br&g;\n在login模式下 通过输入bash即可打开一个non-login shell 如果是&l;code&g;bash --login&l;/code&g; 则打开一个login shell&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;interactive shell&l;/code&g;: 在大多数远程工具连接服务器后打开的都是interactive shell( 交互式shell ) 改模式下,shell等待你输入命令并解释和执行这些命令,然后继续等待下一个命令。&l;/li&g;\n&l;li&g;&l;code&g;non-interactive shell&l;/code&g;: 一般是指执行shell脚本时的模式,通过&l;code&g;bash test.sh&l;/code&g;这种形式执行脚本文件,它并不与用户交互 而是一次性执行脚本 当脚本执行完毕 shell即终止。&l;/li&g;\n&l;/ul&g;\n&l;p&g;一般以&a;quot;#!/bin/bash&a;quot; 开头的shell脚本是non-login non-interactive shell&l;br&g;\n如果以&a;quot;#!/bin/bash --login&a;quot;开头的shell脚本时login non-interactive shell&l;/p&g;\n&l;h2 id=\&q;查看和切换shell\&q;&g;查看和切换SHELL&l;a title=\&q;#查看和切换shell\&q; href=\&q;#查看和切换shell\&q;&g;&l;/a&g;&l;/h2&g;\n&l;figure class=\&q;highlight sh\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 查看当前shell&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;echo&l;/span&g; &l;span class=\&q;variable\&q;&g;$SHELL&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 更改shell, 会修改/etc/passwd中配置给用户的shell, 重新登录生效&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;chsh -s /usr/bin/zsh&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 直接输入要使用的shell的可执行文件路径启动对应shell, 因为路径已经在PATH中可直接使用可执行文件名&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;zsh &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 查看正在使用的shell, 可能和$SHELL不同&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;echo&l;/span&g; &l;span class=\&q;variable\&q;&g;$0&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# ctrl d, 退回原来的shell&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# set 命令查看设置当前shell参数&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;set&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;set&l;/span&g; -o vi &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;set&l;/span&g; varname=value&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# $- 是一个特殊的环境变量,用于显示当前shell的设置标志(set flags)。每个标志位对应一个字母或数字,用于表示shell的不同设置选项。对应的字符串对应 set -o 中的选项&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;echo&l;/span&g; $-&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 使修改过的shell配置立即生效&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;source&l;/span&g; ~/.bashrc&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;shell配置文件的读取\&q;&g;SHELL配置文件的读取&l;a title=\&q;#shell配置文件的读取\&q; href=\&q;#shell配置文件的读取\&q;&g;&l;/a&g;&l;/h2&g;\n&l;ul&g;\n&l;li&g;&l;code&g;/etc/profile&l;/code&g; 全局系统配置会首先读取&l;/li&g;\n&l;/ul&g;\n&l;p&g;然后读取各自的用户配置文件, 如bash:&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;.bashrc&l;/code&g;是Bash Shell的配置文件,它在每次&l;code&g;打开新的终端窗口时加载&l;/code&g;。它通常包含设置个人环境变量、路径配置、命令别名、自定义函数等的命令。~/.bashrc文件会去加载&l;code&g;/etc/bashrc&l;/code&g;.&l;br&g;\n对于bash, non-login shell只会读取.bashrc; non-interactive non-login shell 不读取任何配置文件,而是会读取环境变量 BASH_ENV所指向的脚本文件&l;/li&g;\n&l;/ul&g;\n&l;p&g;&l;code&g;~/.profile. ~/.bash_profile ~/.bash_login &l;/code&g; 都这三个文件基本都是去加载.bashrc, 只会读取一个&l;/p&g;\n&l;ul&g;\n&l;li&g;\n&l;p&g;&l;code&g;.profile&l;/code&g; 是一个通用的Shell配置文件,它在用户登录时加载,无论使用的是那种shell.&l;/p&g;\n&l;/li&g;\n&l;li&g;\n&l;p&g;&l;code&g;.bash_profile&l;/code&g; 这是Bash Shell的另一个配置文件,它在用户登录时加载,类似于.profile。在某些系统中,.bash_profile会优先于.profile加载。&l;/p&g;\n&l;/li&g;\n&l;li&g;\n&l;p&g;&l;code&g;.bash_login&l;/code&g;:这也是Bash Shell的配置文件之一,它在用户登录时加载&l;/p&g;\n&l;/li&g;\n&l;li&g;\n&l;p&g;&l;code&g;.bash_logout&l;/code&g;: 当每次退出系统(退出bash shell)时, 执行该文件.&l;/p&g;\n&l;/li&g;\n&l;/ul&g;\n&l;p&g;其他不同类型的shell&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;.zshrc&l;/code&g;是Zsh Shell的配置文件,它也在每次打开新的终端窗口时加载.&l;/li&g;\n&l;li&g;&l;code&g;.cshrc&l;/code&g; 是C Shell(csh)的配置文件,&l;/li&g;\n&l;li&g;&l;code&g;.tcshrc&l;/code&g; 是TC Shell(tcsh)的配置文件&l;/li&g;\n&l;li&g;&l;code&g;.kshrc&l;/code&g; 是Korn Shell(ksh)的配置文件&l;/li&g;\n&l;li&g;&l;code&g;~/.config/fish/config.fish&l;/code&g; Fish Shell 配置文件&l;/li&g;\n&l;/ul&g;\n&l;p&g;&l;strong&g;参考&l;/strong&g;&l;/p&g;\n&l;ol&g;\n&l;li&g;&l;a href=\&q;https://www.jianshu.com/p/a9b3e685eb3c\&q; target=\&q;_blank\&q;&g;linux环境变量之profile .bash_profile .bash_login .profile .bashrc 加载详解&l;/a&g;&l;/li&g;\n&l;/ol&g;\n&q;,&q;prev&q;:{&q;title&q;:&q;[Win]23H2Copilot解决点击无响应和地区不可用&q;,&q;link&q;:&q;2023/11/28/[Win]23H2Copilot解决点击无响应和地区不可用&q;},&q;next&q;:{&q;title&q;:&q;[VSCode]禁止预览Markdown同步&q;,&q;link&q;:&q;2023/11/27/[VSCode]禁止预览Markdown同步&q;},&q;plink&q;:&q;https://www.slacr.site/2023/11/27/[Linux]Shell与环境变量/&q;,&q;toc&q;:[{&q;id&q;:&q;bourne-shell&q;,&q;title&q;:&q;Bourne shell&q;,&q;index&q;:&q;1&q;},{&q;id&q;:&q;bourne-compatible-shells&q;,&q;title&q;:&q;Bourne compatible shells&q;,&q;index&q;:&q;2&q;},{&q;id&q;:&q;/etc/profile&q;,&q;title&q;:&q;&a;#x2F;etc&a;#x2F;profile&q;,&q;index&q;:&q;3&q;},{&q;id&q;:&q;shell-分类&q;,&q;title&q;:&q;Shell 分类&q;,&q;index&q;:&q;4&q;},{&q;id&q;:&q;查看和切换shell&q;,&q;title&q;:&q;查看和切换SHELL&q;,&q;index&q;:&q;5&q;},{&q;id&q;:&q;shell配置文件的读取&q;,&q;title&q;:&q;SHELL配置文件的读取&q;,&q;index&q;:&q;6&q;}],&q;reward&q;:true,&q;copyright&q;:{&q;author&q;:&q;slacr_&q;,&q;license&q;:&q;&l;a href=\&q;https://creativecommons.org/licenses/by-nc-sa/4.0/\&q; target=\&q;_blank\&q;&g;&l;img src = \&q;/lib/cc-by-nc-sa.svg\&q;&g;&l;/a&g;&q;,&q;published&q;:&q;November 27, 2023&q;,&q;updated&q;:&q;November 27, 2023&q;},&q;reading_time&q;:&q;1958 words in 13 min&q;}}a;#123;PS1-&a;#125;&l;/span&g;&a;quot;&l;/span&g; ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g; [ &l;span class=\&q;string\&q;&g;&a;quot;${BASH-}\&q; ] &a;&a; [ \&q;$BASH&a;quot;&l;/span&g; != &l;span class=\&q;string\&q;&g;&a;quot;/bin/sh&a;quot;&l;/span&g; ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;# The file bash.bashrc already sets the default PS1.&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;comment\&q;&g;# PS1=&a;#x27;\\h:\\w\\$ &a;#x27;&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g; [ -f /etc/bash.bashrc ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; . /etc/bash.bashrc&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;else&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;if&l;/span&g; [ &l;span class=\&q;string\&q;&g;&a;quot;&l;span class=\&q;subst\&q;&g;$(id -u)&l;/span&g;&a;quot;&l;/span&g; -eq 0 ]; &l;span class=\&q;keyword\&q;&g;then&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; PS1=&l;span class=\&q;string\&q;&g;&a;#x27;# &a;#x27;&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;else&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; PS1=&l;span class=\&q;string\&q;&g;&a;#x27;$ &a;#x27;&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g; &l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;keyword\&q;&g;fi&l;/span&g;&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;p&g;这段默认脚本首先通过if [ “$(id -u)” -eq 0 ]; then判断当前用户是否为root用户。如果是root用户,则将PATH设置为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,否则将PATH设置为/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games。&l;/p&g;\n&l;p&g;接下来,判断命令行提示符PS1(Prompt String 1)是否已经被设置。如果已经设置,则检查当前Shell是否为Bash,并且不是以/bin/sh作为Bash解释器。如果是这样,则不修改PS1,并且尝试加载/etc/bash.bashrc文件。如果/etc/bash.bashrc存在,则将其包含到当前Shell配置中。&l;/p&g;\n&l;p&g;如果PS1未被设置,则根据当前用户是否为root用户,设置PS1为’# ‘(root用户)或’$ &s;(非root用户),用作命令行提示符。&l;/p&g;\n&l;p&g;最后,检查是否存在&l;code&g;/etc/profile.d&l;/code&g;目录。如果存在,则遍历该目录下的所有.sh文件,并加载每个文件中的配置。&l;/p&g;\n&l;h2 id=\&q;shell-分类\&q;&g;Shell 分类&l;a title=\&q;#shell-分类\&q; href=\&q;#shell-分类\&q;&g;&l;/a&g;&l;/h2&g;\n&l;p&g;以上是按照Shell的不同实现特点和变体版本能分得到 Bourne Shell(sh), Bourne compatible shells(bash, zsh, ash…)&l;/p&g;\n&l;p&g;按是否登录和交互又能分为:&l;br&g;\n登陆的维度划分:login shell , non-login shell&l;br&g;\n交互的维度划分:interactive shell , non-interactive shell&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;login shell&l;/code&g;: 需要用户名、密码登录后才能进入的shell。在大多数情况下 ,远程终端工具(secureCRT xshell putty)通过ssh连接都是login shell&l;/li&g;\n&l;li&g;&l;code&g;non-login shell&l;/code&g;: 一般是在图形界面中启动一个终端shell 或者在login shell终端输入shell对应路径会打开一个临时shell&l;/li&g;\n&l;/ul&g;\n&l;p&g;通过&l;code&g;su username&l;/code&g; 切换到用户得到一个non-login shell; &l;code&g;su - username&l;/code&g; 切换可以获得一个login shell&l;br&g;\n在login模式下 通过输入bash即可打开一个non-login shell 如果是&l;code&g;bash --login&l;/code&g; 则打开一个login shell&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;interactive shell&l;/code&g;: 在大多数远程工具连接服务器后打开的都是interactive shell( 交互式shell ) 改模式下,shell等待你输入命令并解释和执行这些命令,然后继续等待下一个命令。&l;/li&g;\n&l;li&g;&l;code&g;non-interactive shell&l;/code&g;: 一般是指执行shell脚本时的模式,通过&l;code&g;bash test.sh&l;/code&g;这种形式执行脚本文件,它并不与用户交互 而是一次性执行脚本 当脚本执行完毕 shell即终止。&l;/li&g;\n&l;/ul&g;\n&l;p&g;一般以&a;quot;#!/bin/bash&a;quot; 开头的shell脚本是non-login non-interactive shell&l;br&g;\n如果以&a;quot;#!/bin/bash --login&a;quot;开头的shell脚本时login non-interactive shell&l;/p&g;\n&l;h2 id=\&q;查看和切换shell\&q;&g;查看和切换SHELL&l;a title=\&q;#查看和切换shell\&q; href=\&q;#查看和切换shell\&q;&g;&l;/a&g;&l;/h2&g;\n&l;figure class=\&q;highlight sh\&q;&g;&l;table&g;&l;tr&g;&l;td class=\&q;gutter\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;1&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;2&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;3&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;4&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;5&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;6&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;7&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;8&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;9&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;10&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;11&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;12&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;13&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;14&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;15&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;16&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;17&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;18&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;19&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;20&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;21&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;22&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;td class=\&q;code\&q;&g;&l;pre&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 查看当前shell&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;echo&l;/span&g; &l;span class=\&q;variable\&q;&g;$SHELL&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 更改shell, 会修改/etc/passwd中配置给用户的shell, 重新登录生效&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;chsh -s /usr/bin/zsh&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 直接输入要使用的shell的可执行文件路径启动对应shell, 因为路径已经在PATH中可直接使用可执行文件名&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;zsh &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 查看正在使用的shell, 可能和$SHELL不同&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;echo&l;/span&g; &l;span class=\&q;variable\&q;&g;$0&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# ctrl d, 退回原来的shell&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# set 命令查看设置当前shell参数&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;set&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;set&l;/span&g; -o vi &l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;set&l;/span&g; varname=value&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# $- 是一个特殊的环境变量,用于显示当前shell的设置标志(set flags)。每个标志位对应一个字母或数字,用于表示shell的不同设置选项。对应的字符串对应 set -o 中的选项&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;echo&l;/span&g; $-&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;comment\&q;&g;# 使修改过的shell配置立即生效&l;/span&g;&l;/span&g;&l;br&g;&l;span class=\&q;line\&q;&g;&l;span class=\&q;built_in\&q;&g;source&l;/span&g; ~/.bashrc&l;/span&g;&l;br&g;&l;/pre&g;&l;/td&g;&l;/tr&g;&l;/table&g;&l;/figure&g;\n&l;h2 id=\&q;shell配置文件的读取\&q;&g;SHELL配置文件的读取&l;a title=\&q;#shell配置文件的读取\&q; href=\&q;#shell配置文件的读取\&q;&g;&l;/a&g;&l;/h2&g;\n&l;ul&g;\n&l;li&g;&l;code&g;/etc/profile&l;/code&g; 全局系统配置会首先读取&l;/li&g;\n&l;/ul&g;\n&l;p&g;然后读取各自的用户配置文件, 如bash:&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;.bashrc&l;/code&g;是Bash Shell的配置文件,它在每次&l;code&g;打开新的终端窗口时加载&l;/code&g;。它通常包含设置个人环境变量、路径配置、命令别名、自定义函数等的命令。~/.bashrc文件会去加载&l;code&g;/etc/bashrc&l;/code&g;.&l;br&g;\n对于bash, non-login shell只会读取.bashrc; non-interactive non-login shell 不读取任何配置文件,而是会读取环境变量 BASH_ENV所指向的脚本文件&l;/li&g;\n&l;/ul&g;\n&l;p&g;&l;code&g;~/.profile. ~/.bash_profile ~/.bash_login &l;/code&g; 都这三个文件基本都是去加载.bashrc, 只会读取一个&l;/p&g;\n&l;ul&g;\n&l;li&g;\n&l;p&g;&l;code&g;.profile&l;/code&g; 是一个通用的Shell配置文件,它在用户登录时加载,无论使用的是那种shell.&l;/p&g;\n&l;/li&g;\n&l;li&g;\n&l;p&g;&l;code&g;.bash_profile&l;/code&g; 这是Bash Shell的另一个配置文件,它在用户登录时加载,类似于.profile。在某些系统中,.bash_profile会优先于.profile加载。&l;/p&g;\n&l;/li&g;\n&l;li&g;\n&l;p&g;&l;code&g;.bash_login&l;/code&g;:这也是Bash Shell的配置文件之一,它在用户登录时加载&l;/p&g;\n&l;/li&g;\n&l;li&g;\n&l;p&g;&l;code&g;.bash_logout&l;/code&g;: 当每次退出系统(退出bash shell)时, 执行该文件.&l;/p&g;\n&l;/li&g;\n&l;/ul&g;\n&l;p&g;其他不同类型的shell&l;/p&g;\n&l;ul&g;\n&l;li&g;&l;code&g;.zshrc&l;/code&g;是Zsh Shell的配置文件,它也在每次打开新的终端窗口时加载.&l;/li&g;\n&l;li&g;&l;code&g;.cshrc&l;/code&g; 是C Shell(csh)的配置文件,&l;/li&g;\n&l;li&g;&l;code&g;.tcshrc&l;/code&g; 是TC Shell(tcsh)的配置文件&l;/li&g;\n&l;li&g;&l;code&g;.kshrc&l;/code&g; 是Korn Shell(ksh)的配置文件&l;/li&g;\n&l;li&g;&l;code&g;~/.config/fish/config.fish&l;/code&g; Fish Shell 配置文件&l;/li&g;\n&l;/ul&g;\n&l;p&g;&l;strong&g;参考&l;/strong&g;&l;/p&g;\n&l;ol&g;\n&l;li&g;&l;a href=\&q;https://www.jianshu.com/p/a9b3e685eb3c\&q; target=\&q;_blank\&q;&g;linux环境变量之profile .bash_profile .bash_login .profile .bashrc 加载详解&l;/a&g;&l;/li&g;\n&l;/ol&g;\n&q;,&q;prev&q;:{&q;title&q;:&q;[Win]23H2Copilot解决点击无响应和地区不可用&q;,&q;link&q;:&q;2023/11/28/[Win]23H2Copilot解决点击无响应和地区不可用&q;},&q;next&q;:{&q;title&q;:&q;[VSCode]禁止预览Markdown同步&q;,&q;link&q;:&q;2023/11/27/[VSCode]禁止预览Markdown同步&q;},&q;plink&q;:&q;https://www.slacr.site/2023/11/27/[Linux]Shell与环境变量/&q;,&q;toc&q;:[{&q;id&q;:&q;bourne-shell&q;,&q;title&q;:&q;Bourne shell&q;,&q;index&q;:&q;1&q;},{&q;id&q;:&q;bourne-compatible-shells&q;,&q;title&q;:&q;Bourne compatible shells&q;,&q;index&q;:&q;2&q;},{&q;id&q;:&q;/etc/profile&q;,&q;title&q;:&q;&a;#x2F;etc&a;#x2F;profile&q;,&q;index&q;:&q;3&q;},{&q;id&q;:&q;shell-分类&q;,&q;title&q;:&q;Shell 分类&q;,&q;index&q;:&q;4&q;},{&q;id&q;:&q;查看和切换shell&q;,&q;title&q;:&q;查看和切换SHELL&q;,&q;index&q;:&q;5&q;},{&q;id&q;:&q;shell配置文件的读取&q;,&q;title&q;:&q;SHELL配置文件的读取&q;,&q;index&q;:&q;6&q;}],&q;reward&q;:true,&q;copyright&q;:{&q;author&q;:&q;slacr_&q;,&q;license&q;:&q;&l;a href=\&q;https://creativecommons.org/licenses/by-nc-sa/4.0/\&q; target=\&q;_blank\&q;&g;&l;img src = \&q;/lib/cc-by-nc-sa.svg\&q;&g;&l;/a&g;&q;,&q;published&q;:&q;November 27, 2023&q;,&q;updated&q;:&q;November 27, 2023&q;},&q;reading_time&q;:&q;1958 words in 13 min&q;}}
slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[Linux]Shell与环境变量

Nov 27, 2023Linux1958 words in 13 min

Bourne shell

Bourne shell是由Stephen Bourne在1979年开发的一种命令行解释器(shell),它是Unix系统上最早的标准shell。Bourne shell的可执行文件路径通常为/bin/sh。

Bourne shell提供了一种交互式和脚本编程环境,用户可以通过命令行界面与操作系统进行交互,并执行各种任务。它支持常见的shell语法,如变量赋值、条件语句、循环结构和命令执行等。

Bourne shell的语法相对简单,不像后续的shell如Bash或Zsh那样提供了大量的扩展功能。然而,由于其广泛的兼容性和较低的资源消耗,Bourne shell仍然在一些嵌入式系统和较旧的Unix系统中得到广泛使用。

虽然Bash是Bourne shell的一个扩展版本,但它并不是严格的Bourne shell。Bash在语法和功能上扩展了Bourne shell,并提供了许多新特性和改进,因此在大多数情况下,Bash可以替代Bourne shell并执行Bourne shell脚本。

Bourne compatible shells

Bourne兼容的shell是一类Unix/Linux操作系统上的命令行解释器(shell),它们遵循了基于Bourne shell的语法和行为。

Bourne shell的语法和行为成为了许多后来的shell的基础,因此出现了很多与Bourne shell兼容的shell。其中一些常见的Bourne兼容的shell包括:

  • Bash(Bourne Again SHell):Bash是Bourne shell的扩展版本,遵循GNU通用公共许可证(GPL). 它是目前大多数Linux系统默认的shell,并且也可在其他Unix系统上使用, 包括Linux、Unix和Mac OS X等。
  • Zsh(Z Shell):Zsh是一个功能丰富的shell,它在Bourne shell的基础上增加了许多新特性和改进。
  • Ksh(Korn Shell):Ksh是Bourne shell的扩展版本,它提供了更多的功能和改进的交互性。
  • Dash:Dash是一个轻量级的Bourne shell替代品,它专注于快速启动和执行脚本的能力。

/etc/profile

/etc/profile是一个系统范围的Shell配置文件,它在用户登录时被加载和执行。该文件通常用于设置系统范围的环境变量、路径配置和其他全局的Shell设置。

当用户登录时,系统会首先加载/etc/profile文件,然后加载用户的个人配置文件(如~/.bash_profile或~/.profile)。这些配置文件会为每个登录用户提供自定义的环境变量和Shell设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$(id -u)" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "$(id -u)" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi

这段默认脚本首先通过if [ “$(id -u)” -eq 0 ]; then判断当前用户是否为root用户。如果是root用户,则将PATH设置为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,否则将PATH设置为/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games。

接下来,判断命令行提示符PS1(Prompt String 1)是否已经被设置。如果已经设置,则检查当前Shell是否为Bash,并且不是以/bin/sh作为Bash解释器。如果是这样,则不修改PS1,并且尝试加载/etc/bash.bashrc文件。如果/etc/bash.bashrc存在,则将其包含到当前Shell配置中。

如果PS1未被设置,则根据当前用户是否为root用户,设置PS1为’# ‘(root用户)或’$ '(非root用户),用作命令行提示符。

最后,检查是否存在/etc/profile.d目录。如果存在,则遍历该目录下的所有.sh文件,并加载每个文件中的配置。

Shell 分类

以上是按照Shell的不同实现特点和变体版本能分得到 Bourne Shell(sh), Bourne compatible shells(bash, zsh, ash…)

按是否登录和交互又能分为:
登陆的维度划分:login shell , non-login shell
交互的维度划分:interactive shell , non-interactive shell

  • login shell: 需要用户名、密码登录后才能进入的shell。在大多数情况下 ,远程终端工具(secureCRT xshell putty)通过ssh连接都是login shell
  • non-login shell: 一般是在图形界面中启动一个终端shell 或者在login shell终端输入shell对应路径会打开一个临时shell

通过su username 切换到用户得到一个non-login shell; su - username 切换可以获得一个login shell
在login模式下 通过输入bash即可打开一个non-login shell 如果是bash --login 则打开一个login shell

  • interactive shell: 在大多数远程工具连接服务器后打开的都是interactive shell( 交互式shell ) 改模式下,shell等待你输入命令并解释和执行这些命令,然后继续等待下一个命令。
  • non-interactive shell: 一般是指执行shell脚本时的模式,通过bash test.sh这种形式执行脚本文件,它并不与用户交互 而是一次性执行脚本 当脚本执行完毕 shell即终止。

一般以"#!/bin/bash" 开头的shell脚本是non-login non-interactive shell
如果以"#!/bin/bash --login"开头的shell脚本时login non-interactive shell

查看和切换SHELL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看当前shell
echo $SHELL
# 更改shell, 会修改/etc/passwd中配置给用户的shell, 重新登录生效
chsh -s /usr/bin/zsh


# 直接输入要使用的shell的可执行文件路径启动对应shell, 因为路径已经在PATH中可直接使用可执行文件名
zsh
# 查看正在使用的shell, 可能和$SHELL不同
echo $0
# ctrl d, 退回原来的shell

# set 命令查看设置当前shell参数
set
set -o vi
set varname=value

# $- 是一个特殊的环境变量,用于显示当前shell的设置标志(set flags)。每个标志位对应一个字母或数字,用于表示shell的不同设置选项。对应的字符串对应 set -o 中的选项
echo $-

# 使修改过的shell配置立即生效
source ~/.bashrc

SHELL配置文件的读取

  • /etc/profile 全局系统配置会首先读取

然后读取各自的用户配置文件, 如bash:

  • .bashrc是Bash Shell的配置文件,它在每次打开新的终端窗口时加载。它通常包含设置个人环境变量、路径配置、命令别名、自定义函数等的命令。~/.bashrc文件会去加载/etc/bashrc.
    对于bash, non-login shell只会读取.bashrc; non-interactive non-login shell 不读取任何配置文件,而是会读取环境变量 BASH_ENV所指向的脚本文件

~/.profile. ~/.bash_profile ~/.bash_login 都这三个文件基本都是去加载.bashrc, 只会读取一个

  • .profile 是一个通用的Shell配置文件,它在用户登录时加载,无论使用的是那种shell.

  • .bash_profile 这是Bash Shell的另一个配置文件,它在用户登录时加载,类似于.profile。在某些系统中,.bash_profile会优先于.profile加载。

  • .bash_login:这也是Bash Shell的配置文件之一,它在用户登录时加载

  • .bash_logout: 当每次退出系统(退出bash shell)时, 执行该文件.

其他不同类型的shell

  • .zshrc是Zsh Shell的配置文件,它也在每次打开新的终端窗口时加载.
  • .cshrc 是C Shell(csh)的配置文件,
  • .tcshrc 是TC Shell(tcsh)的配置文件
  • .kshrc 是Korn Shell(ksh)的配置文件
  • ~/.config/fish/config.fish Fish Shell 配置文件

参考

  1. linux环境变量之profile .bash_profile .bash_login .profile .bashrc 加载详解
  • Author:

    slacr_

  • Copyright:

  • Published:

    November 27, 2023

  • Updated:

    November 27, 2023

Buy me a cup of coffee ☕.

1000000