8.6 管道符和作业控制
8.7/8.8 shell变量
8.9 环境变量配置文件
8.6 管道符和作业控制:
~cat 1.txt |wc -l ; cat 1.txt |grep 'aaa'
管道符前面的命令输出的结果给后面的命令
~ctrl z 暂停一个任务
比如在编辑一个文件,想要查看磁盘空间,可以ctrl z暂停。fg可以把暂停的这个任务在调回来
可暂停多个任务
~jobs查看后台的任务
jobs可以把ctrl z的任务调出来,调出所有后台的任务
~bg[id]把任务调到后台
可以把一个正在执行的任务,搞到后台。
多个任务可后面加序号
不加序号就是执行最后一个
~fg[id]把任务调到前台
jobs可查看多个已停止的任务,fg 后面加序号,可回到这个序号的任务
不加序号,执行最后一个
~命令后面加&直接丢到后台
~两个终端是无法使用jobs查看的,但可以查看进程
---------------------------------------------------------------------------------------------------------------------------------------
8.7/8.8 shell变量:
~1.PATH,HOME,PWD,LOGNAME
~2.env命令
~3.set命令多了很多变量,并且包括用户自定义的变量
~4.自定义变量a=111
~5.变量名规则:字母、数字下划线,首位不能为数字
可以写a=1 或者a_1=1 又或者_a=1,但是不能写1=1
~6.变量值有特殊符号是需要用单引号括起来
例如空格,a=‘1 2 3’
~7.变量的累加,(重点,实例有介绍单引号、双引号的用法)
可累计查看 echo $a$b
双引号、单引号
~8.全局变量export b=2 (详细看实例)
bash生成一个子shell
exit返回上一个shell
在一个终端下设置的变量设置的,在另一个下看不到的叫非全局变量或本地变量
全局变量只往下生效,子文件-子子文件这样生效。往上不生效,子文件不会影响父文件
也就是说,建立了1文件和2文件,1能使用2的变量,但2不能使用1的变量
运行子shell,直接运行bash
~9.unset变量
unset后面跟变量的名字,可取消名字
变量的名字通常是大写的英文字母
变量的值不一定是大写的
env可查看变量
set也可查看变量,也包括用户的变量,set一般是shell脚本
4.
我们可以自定义用户的变量,就是PATH
[root ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root ~]# a=111
[root ~]# echo $a
111
[root ~]# set |grep '111'
_=111
a=111
当然不是系统内核的。他只在set里找到,也就是用户自定义的变量
5.
[root ~]# a=1
[root@localhost ~]# echo $a
1
[root@localhost ~]# a_1=1
[root@localhost ~]# echo $a_1
1
[root@localhost ~]# _a=1
[root@localhost ~]# echo $_a
1
[root@localhost ~]# 1=1
-bash: 1=1: 未找到命令
[root@localhost ~]# 2=a
-bash: 2=a: 未找到命令
6.
[root@localhost ~]# a=1 2 3
-bash: 2: 未找到命令
[root@localhost ~]# a='1 2 3'
[root@localhost ~]# echo $a
1 2 3
7.
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# echo $a$b 简单的可以直接写
12
[root@localhost ~]# a='a$bc' a=复杂的 用单引号括起来
[root@localhost ~]# echo $a$b 再次$a$b
a$bc2 a就代表了上边用单引号括起来的字符
[root@localhost ~]# c=a"$b"c 如果想要让c=$b的值,就要用双引号括起来
[root@localhost ~]# echo $c 所以他所表达出来的值,就是$b结果的值,而不是代表$b这个字符
a2c
8.
按 w 可以看到有几个登录的
[root@localhost ~]# w
15:26:00 up 8 min, 2 users, load average: 0.01, 0.12, 0.12
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.159.1 15:19 0.00s 0.13s 0.04s w
root pts/1 192.168.159.1 15:25 23.00s 0.05s 0.05s -bash
登录的 各分配了 分别从这个IP
都是root TTY 登过来
两个终端我们分别看一下,各自的TTY
[root@localhost ~]# echo $SSH_TTY
/dev/pts/0 分别对应以上的TTY
[root@localhost ~]# echo $SSH_TTY
/dev/pts/1 分别对应以上的TTY
我们在终端1上设置axin=linux这个变量,在终端2上是没有的
[root@localhost ~]# axin=linux
[root@localhost ~]# echo $axin
linux 终端1上定义,有这个变量
[root@localhost ~]# echo $axin
终端2上就没有
[root@localhost ~]#
shell本身是一个进程。我们输入 bash,相当于进入另一个终端。再w一下
[root@localhost ~]# bash
[root@localhost ~]# w 发现仍然在pts/0
15:38:11 up 20 min, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.159.1 15:19 3.00s 0.17s 0.02s w
root pts/1 192.168.159.1 15:25 3:47 0.05s 0.05s -bash
pstree一下,我们linux上没有pstree这个命令,安装了psmisc
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───bash───pstree 我们现在这这个位置,前面的bash是我们刚打开的新 的bash,在他的基础上运行这个命令叫pstree
│ └─sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
我们再运行echo $axin,发现也没有生效我们之前设置的axin=linux
[root@localhost ~]# echo $axin
[root@localhost ~]#
我们exit,退出刚才那个bash
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $axin 发现有有了刚才设置的axin=linux
linux
像这样的叫为非全局变量,或者本地变量(load),仅仅在这个终端下生效
那怎么变成全局的呢:
[root@localhost ~]# export axin=linux 使用export
[root@localhost ~]# echo $axin
linux
[root@localhost ~]# bash 我们再bash一个
[root@localhost ~]# echo $axin 就有了
linux
这个就叫做全局变量,也就是说在一开始的那个bash我们设置了axin=linux,那么他的子bash或者子子bash都生效。
但是在另一个终端下不会生效,例如,我们再打开另一个终端,pstree
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───bash───bash
│ └─sshd───bash───pstree 我们在这,他跟上面的是并列关系,所以不会生效
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
演练了这么多,我们得出一个结论。
所以,所谓的全局变量,是向下的。在这个shell的基础上生成子shell,子子shell等等,这样的话是生效的。不会向上的全局的!!
---------------------------------------------------------------------------------------------------------------------------------------
8.9 环境变量配置文件:
系统层次(这两个文件不要动):
~ /etc/profile 用户环境变量,交互,登录才执行
我们登录才会执行。他会调用bashrc
~ /etc/bashrc 用户不用登录,执行shell就生效
我们执行shell就可以生效。bashrc是执行shell脚本的时候,用户不用登录,就可以执行shell脚本,只要执行shell,他就会调用bashrc里面的一些配置
用户层次:
~ ~/.bashrc
~ ~/.bash_profile
~ ~/.bash_history
~ ~/bash_logout
用户退出的时候,需要做的一些操作
例如,让一个用户每次退出的时候都要删除他的命令历史。就可以把这个配置文件放到logout里面
~ ps1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$'
ps1表示 [root@axinlinux-01 ~]# 。echo $ps1可以查看这些配置文件,都是可以改的。但平常不会 去动
后面的这些字符串是设置 [root@axinlinux-01 ~]# 的颜色
ps2表示 进入另一个终端,例如MYSQL的时候所显示的。但仅仅是一个>