Linux中Shell与环境变量与配置文件

Shell是什么

Shell是个程序,他会在用户登录系统后系统开启的,他可以通过标准输入来接收命令,然后执行命令,Shell可以执行内部命令和外部命令,内部命令就是Shell程序里面自己的逻辑,外部命令是Shell调用其他程序。
操作系统的核心是被保护的,我们只能通过Shell将我们输入的指令与核心沟通,让核心控制硬件来完成工作。

shell内部逻辑简介

Shell的实现有哪些

  • zsh
    很多人的 mac 中会使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集,它兼容 bash,还有自动补全等好用的功能。
  • sh
    sh的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 shell。
    csh
    sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
  • tcsh
    tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
  • ash
    ash一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
  • bash
    bash由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 shell 代码可以不加修改地在 bash 中运行。尽管如此,bash 和 sh 还是有一些不同之处:一方面,bash 扩展了一些命令和参数;另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。

如何看自己的Linux上安装了哪些Shell

可以通过查看/etc/shells文件来看自己的Linux上有哪些可用的Shell

[root@VM-16-13-centos ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

也可以通过echo shell查看当前用户默认的shell

如何查看当前用户配置的Shell

当我们登录的时候,系统就会给我们一个shell让我们来工作。Linux上有这么多shell那到底用的是哪个呢?
这个登录取得的shell就记录在/etc/passwd文件中,文件中每一行的最后就是登录后的默认shell

[root@VM-16-13-centos ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Shell启动时干了什么

你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境设置文件的 存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作 环境啦! 而这些配置文件又可以分为全体系统的配置文件以及使用者 个人偏好配置文件。要注意的是, 我们前几个小节谈到的命令别名 啦、自订的变量啦,在你登出 bash 后就会失效,所以你想要保留你的 设置, 就得要将这些设置写入配置文件才行

Shell的配置文件

一般的shell都有两种配置文件,一者是全局的,放在/etc里,文件名前面没有’.'(非隐藏),另一种是放在用户家目录,只对当前用户生效,是隐藏的。

login shell与non-login shell在启动shell时读取的配置文件不同
  • login shell:取得 bash 时需要完整的登陆流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登陆,需要输入使用者的帐号 与密码,此时取得的 bash 就称为“ login shell ”啰;
  • non-login shell:取得 bash 接口的方法不需要重复登陆的举动,举 例来说,(1)你以 X window 登陆 Linux 后, 再以 X 的图形化接 口启动终端机,此时那个终端接口并没有需要再次的输入帐号与密 码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入帐号密 码, 那第二个 bash (子程序) 也是 non-login shell 。

注意不同的shell实现,系统级配置及用户级配置的文件的名字可能不一样

login shell读取:
  1. 系统级配置bash( /etc/profile):这是系统整体的设置,你最好不要修改这个文件;
  2. 用户级配置:bash(~/.bash_profile~/.bash_login~/.profile):属于使用者个人设置,你要改自己的数据,就写入这里。
    在这里插入图片描述
    实线的的方向是主线流程,虚线的方向则是被调用的配置文件(即配置文件中调用了其他配置文件)! 从上面我们也可以清楚的知道,在 CentOS 的 login shell 环境下,最终 被读取的配置文件是“ ~/.bashrc ”这个文件喔!所以,你当然可以将自己 的偏好设置写入该文件即可。
non-login shell读取:
  1. 仅会读取bash(~/.bashrc) 而已啦

注意,所有的配置文件中可能还会读取其他配置文件

source :读入环境配置文件的指令

由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才 会读取的配置文件,所以, 如果你将自己的偏好设置写入上述的文件 后,通常都是得登出再登陆后,该设置才会生效。那么,能不能直接读 取配置文件而不登出登陆呢? 可以的!那就得要利用 source 这个指令 了!

利用 source 或小数点 (.) 都可以将配置文件的内容读进来目前 的 shell 环境中! 举例来说,我修改了 ~/.bashrc ,那么不需要登出,立 即以 source ~/.bashrc 就可以将刚刚最新设置的内容读进来目前的环境 中!很不错吧!还有,包括 ~/bash_profile 以及 /etc/profile 的设置中, 很多时候也都是利用到这个 source (或小数点) 的功能喔!


环境变量、别名

环境变量与自订变量
  • 环境变量:在当前shell程序和当前shell的所有子程序中都可以使用
  • 自订变量:只能在当前shell程序中使用

子程序仅会继承父程序的环境变量,子程序不会继承父程序的自订变量啦!所以 你在原本 bash 的自订变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现。

如何查看环境变量(env、set、echo)
  • env
    会打印出目前shell环境下所有的环境变量与其内容
  • set
    会打印出所有的变量包括环境变量和内订变量
  • echo
    使用echo就可以读书变量,有两种取用方式echo $变量名echo ${变量名},读取没有被声明的变量时会被返回空
如何设置环境变量

设置内订变量

jaan@zhangdeshuaideMacBook-Pro ~ % var=test

设置环境变量很简单,在命令行用等号=连接变量名与它的内容回车就行;但是变量的设置有很多规则

  1. 等号两边不能直接接空白字符,如下所示为错误:
    myname = VBirdmyname=VBird Tsai
  2. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下 为错误:
    2myname=VBird
  3. 变量内容若有空白字符可使用双引号“"”或单引号“'”将变量内容结合起来
  4. 单引号与双引号的不同在于双引号仍然可以保有变量的内容,而单引号不能
  5. 可用跳脱字符“ \ ”将特殊符号(如 [Enter], $, , 空白字符, '等)变成 一般字符,如:
    myname=VBird\ Tsai
  6. 在一串指令的执行中,还需要借由其他额外的指令所提供的信息 时,可以使用反单引号指令即`指令` 或者$(指令)。特别注意,那个 `是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要 取得核心版本的设置:
    version=$(uname -r)echo $version可得3.10.0- 229.el7.x86_64
  7. 若该变量为扩增变量内容时,则可用"$变量名称"${变量}累加 内容,如下所示: PATH="$PATH":/home/binPATH=${PATH}:/home/bin

变量从键盘读取

将内订变量变为环境变量

由于内订变量只能在当前shell程序中读取,若该变量需要在其他子程序执行,则需要以export来使变量变成环境变量:export 变量名

将环境变量变为内订变量

删除变量

取消变量的方法为使用unset例如取消myname 的设置:unset myname

如何使用变量

变量只能需要使用命令才能够调用出变量的内容,如直接在命令行使用命令读取变量内容echo $PATH,或者在shell脚本中的命令中读取变量(如果是在非shell语言如java、c、python等编程时,每个语言都有自己的api可以获取环境变量,此处不举例了自行搜索)。
注意,只有变量被export为环境变量后,才能在子程序中读取,否则只能在声明变量的当前程序读取

如何设置别名

当你的命令很长,里面的命令和参数又基本不会改变的情况下如由管道连接多个命令又有很多参数,这样可以给这个命令设置一个简单的别名,以后直接输入别名执行就可以了
使用alias命令可以给命令设置别名,alias 的定义 规则与变量定义规则几乎相同,你只要在 alias后面加上你的 {“别 名”=‘指令 选项…’ }即alias lm='ls -al | more' 以后你只要输入 lm 就相当于输入了 ls -al|more

如何查看别名

执行alias命令可以查看所的别名
若只想显示某个别名代表的含义可输入alias name

[root@VM-16-13-centos ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
别名的有效范围

shell中定义的别名仅在当前shell生命周期中有效:别名有效范围为当前shell进程

令别名只针对当前回话有效,一旦连接断开并重连之前设置的别名别不在有效。
可以通过将设置别名的命令写进启动配置文件使别名持久生效。这样,每次连入系统的时候别名都会生效。若想在命令写入启动文件后立即生效记得执行source命令。若写在家目录下的配置文件中则只对该用户生效,若想对所有用户生效,则可以写在/etc目录下的配置文件中
不用的shell实现和不同的Linux发行版本下的shell配置文件名称不同,见上文配置文件的介绍小结。

环境变量与别名的区别

命令别名是“新创一个新的指 令, 你可以直接下达该指令”的,至于变量则需要使用类似“ echo ”指令 才能够调用出变量的内容!

不同的shell间共享环境变量和别名吗?

别名只在当前shell有效,所以在不同的shell中看不到其他shell里设置的别名,除非在这个shell里重新设置(1:可以在拉起shell的配置文件中设置,这样可以做到无感知,2在不同的shell里自行设置)
变量只在当前shell进程有效,环境变量在当前shell进行和当前shell进行的子进程有效,注意这里是当前进行和子进程,所以只要是当前进程或者子进程都可以访问到,这个跟这个子进程是不同的shell实现或者根本不是shell也没关系,只要是子进程就行。

在Shell里输入的命令是如何执行的

指令运行的顺序可以这样看:

  1. 以相对/绝对路径执行指令,例如“ /bin/ls ”或“ ./ls ”;(如过命令行输入的字符串不是以./或者/开始的,那么这一项就跳过)
  2. 由 alias 找到该指令来执行;
  3. 由bash内置的(builtin)指令来执行;
  4. 通过$PATH这个变量的顺序搜寻到的第一个指令来执行

可以下达 /bin/ls 及单纯的 ls 看看,会发现使用 ls 有 颜色但是 /bin/ls 则没有颜色。 因为 /bin/ls 是直接取用该指令来下达, 而 ls 会因为alias ls='ls --color=auto'这个命令别名而先使用! 如果想 要了解指令搜寻的顺序,其实通过 type -a ls 也可以查询的到啦

[root@VM-16-13-centos ~]# type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls

内部命令、外部命令

内部命令就是Shell程序里面自己的逻辑,外部命令是Shell调用其他程序。
可以通过type命令来查看命令是内部命令还是外部命令

jaan@zhangdeshuaideMacBook-Pro ~ % type ls
ls is /bin/ls     #直接给出了该命令的地址,这中是外部命令
jaan@zhangdeshuaideMacBook-Pro ~ % type cd
cd is a shell builtin   #内部命令

shell script

可以将你平时管理系统常需要下达的连续指令写成一个文件, 该文件并且可以 通过对谈互动式的方式来进行主机的侦测工作!也可以借由 shell 提供 的环境变量及相关指令来进行设计,哇!整个设计下来几乎就是一个小 型的程序语言了!

待补充

  • shell除了按是否登录角度分为login shell外按是否可以交互角度也分为不同的类型,是否可交互类下的配置文件读取是怎样的?
  • 如何查看当前shell在启动时读取了哪些配置文件?
  • 在家目录下出现的配置文件必然有/etc下有与之对应的配置吗?
  • 待整理:https://www.miaokee.com/321494.html、https://www.cnblogs.com/wwjj4811/p/14755032.html

参考资料

  • 鸟哥的Linux私房菜基础学习篇
  • https://www.jianshu.com/p/a891af6f87e0
  • https://www.cnblogs.com/victl/p/4498136.html
  • https://blog.csdn.net/weixin_42497828/article/details/116557081
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值