Shell是个程序,他会在用户登录系统后系统开启的,他可以通过标准输入来接收命令,然后执行命令,Shell可以执行内部命令和外部命令,内部命令就是Shell程序里面自己的逻辑,外部命令是Shell调用其他程序。
操作系统的核心是被保护的,我们只能通过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让我们来工作。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
你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境设置文件的 存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作 环境啦! 而这些配置文件又可以分为全体系统的配置文件以及使用者 个人偏好配置文件。要注意的是, 我们前几个小节谈到的命令别名 啦、自订的变量啦,在你登出 bash 后就会失效,所以你想要保留你的 设置, 就得要将这些设置写入配置文件才行
一般的shell都有两种配置文件,一者是全局的,放在/etc里,文件名前面没有’.'(非隐藏),另一种是放在用户家目录,只对当前用户生效,是隐藏的。
注意不同的shell实现,系统级配置及用户级配置的文件的名字可能不一样
/etc/profile
):这是系统整体的设置,你最好不要修改这个文件;~/.bash_profile
或~/.bash_login
或~/.profile
):属于使用者个人设置,你要改自己的数据,就写入这里。~/.bashrc
) 而已啦注意,所有的配置文件中可能还会读取其他配置文件
由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才 会读取的配置文件,所以, 如果你将自己的偏好设置写入上述的文件 后,通常都是得登出再登陆后,该设置才会生效。那么,能不能直接读 取配置文件而不登出登陆呢? 可以的!那就得要利用 source 这个指令 了!
利用 source 或小数点 (.) 都可以将配置文件的内容读进来目前 的 shell 环境中! 举例来说,我修改了 ~/.bashrc ,那么不需要登出,立 即以 source ~/.bashrc 就可以将刚刚最新设置的内容读进来目前的环境 中!很不错吧!还有,包括 ~/bash_profile 以及 /etc/profile 的设置中, 很多时候也都是利用到这个 source (或小数点) 的功能喔!
子程序仅会继承父程序的环境变量,子程序不会继承父程序的自订变量啦!所以 你在原本 bash 的自订变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现。
echo $变量名
、 echo ${变量名}
,读取没有被声明的变量时会被返回空设置内订变量
jaan@zhangdeshuaideMacBook-Pro ~ % var=test
设置环境变量很简单,在命令行用等号=连接变量名与它的内容回车就行;但是变量的设置有很多规则
myname = VBird
或myname=VBird Tsai
2myname=VBird
myname=VBird\ Tsai
version=$(uname -r)
再echo $version
可得3.10.0- 229.el7.x86_64
"$变量名称"
或${变量}
累加 内容,如下所示: PATH="$PATH":/home/bin
或PATH=${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里重新设置(1:可以在拉起shell的配置文件中设置,这样可以做到无感知,2在不同的shell里自行设置)
变量只在当前shell进程有效,环境变量在当前shell进行和当前shell进行的子进程有效,注意这里是当前进行和子进程,所以只要是当前进程或者子进程都可以访问到,这个跟这个子进程是不同的shell实现或者根本不是shell也没关系,只要是子进程就行。
指令运行的顺序可以这样看:
- 以相对/绝对路径执行指令,例如“ /bin/ls ”或“ ./ls ”;(如过命令行输入的字符串不是以./或者/开始的,那么这一项就跳过)
- 由 alias 找到该指令来执行;
- 由bash内置的(builtin)指令来执行;
- 通过$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 提供 的环境变量及相关指令来进行设计,哇!整个设计下来几乎就是一个小 型的程序语言了!