8.6 管道符和作业控制
| 管道符
把前面的命令运行的结果丢给后面的命令
#cat /etc/passwd |wc -l 【wc -l 的意思是显示当前文档的行数,需要反向重定向wc -l < 1.txt】
#cat /etc/passwd >> 1.txt
作业控制:
Ctrl+z 暂停
fg 恢复暂停的命令
bg 切换至后台运行
Ctrl+c 终止
示例:
vi 1.txt
输入内容sadsfdfadfadfafdasdf
按 ESC ,使用Ctrl+z 暂停 #vi 1.txt
[1]+ stopped vi 1.txt 【vi命令已经停止】
使用 fg 命令恢复,回到bi窗口。
再次暂停,
#jobs 【查看被暂停或者后台运行的任务】
[1]+ stopped vi 1.txt
#bg 【暂停的命令去后台运行】
[1]+ vi 1.txt &
[1]+ Stopped vi 1.txt
vi命令不支持后台运行
#vmstat 1 > /tmp/1.log
^Z 【暂停命令】
[2]+ Stopped vmstat 1 > /tmp/1.log
#jobs
[1] - stopped vi 1.txt
[2]+ Stopped vmstat 1 > /tmp/1.log +表示优先级更高
#bg 2
[2]+ vmstat 1 > /tmp/1.log &
多个被暂停的任务会有编号,jobs可以查看所有任务,那么使用fg,bg的时候就需要有编号。bg2 把第二个被暂停的任务丢到后台跑起来,丢入后台需要使用在命令后加一个&符号,中间有个空格。
8.7/8.8 shell变量
命令env 列出系统预设的全部环境变量
#env
常见变量
#echo $PATH 决定了shell讲到哪些目录中寻找命令或程序
#echo $HOME 当前用户主目录
#echo $PWD 当前目录
#echo $LOGNAME 当前用户登录名
HISTSIZE 历史记录数
HOSTNAME 主机名称
SHELL 当前用户shell变量
LANG 语言相关环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
命令set 列出全部预设的全部环境变量,包括env列出的是系统变量、用户自定义变量、额外变量
#set
set不仅可以显示系统预设的变量,也可以列出用户自定义的变量显示出来。
#myname=Aming
#echo $myname
Aming
#set |grep myname
myname=Aming
当前shell设定的变量,只针对当前shell有效。
#bash 此命令进入下一个子shell中
#echo $myname
没有返回结果
#exit
#echo $myname
Aming
1、让系统内所有用户登录后都能使用该变量
在/etc/profile文件最末行加入 export myname=Aming
运行 source /etc/profile 生效
2、只让当前用户使用该变量
用户主目录下的.bashrc 文件最末行加入 export myname=Aming
运行 source /etc/profile 生效
设定变量的规则
格式 a=b a为变量名,b为变量内容。前后没有空格
变量名由英文、数字以及下划线组成,不能数字开头
变量内容b带有特殊字符如空格,需要加上单引号
myname='Aming Li'
变量内容b本身带有单引号,需要双引号
myname="Aming's"
变量内容b需要其他命令运行结果,使用反引号
myname=pwd
变量内容可以累加其他变量内容,需要双引号
#myname="$LOGNAME"Aming
#echo $myname
rootAming
单引号双引号的区别
使用双引号,不会取消里面出现的特殊字符本身的作用。
使用单引号,里面的特殊字符全部失去本身的作用。
单引号里面所有特殊符号都会变成普通符号,比如 '123$a' 这里面的$a就不是引用变量了,
如果用双引号就可以引用变量 "123$a" 我具体举个例子吧:
[root@localhost ~]# a=9; echo '123$a'; b=8; echo "123$b"
123$a
1238
当前shell运行bash,会进入一个子bash。
pstree 会把Linux系统中所有进程通过树形结构打印出来。在父shell中设定变量,子shell不会生效,如果要生效,需要export指令。
#abc=123
#export abc
export其实是声明变量的意思,让该shell的子shell知道变量的值。export不加变量值, 仅仅是可以打印出当前用户的一些变量出来。
取消变量
#unset abc
#unset myname
NOTE: 全局变量,仅仅在当前shell下或者当前的脚本里面有效果。
/etc/profile 里面,每次登陆,所有终端,甚至shell脚本里面都有效果。
env,set,export三个命令的区别
1、set,env和export这三个命令都可以用来显示shell变量
[root@localhost root]# aaa=bbb
[root@localhost root]# echo $aaa
bbb
[root@localhost root]# set |grep aaa
aaa=bbb
[root@localhost root]# env |grep aaa
[root@localhost root]# export aaa
[root@localhost root]# env |grep aaa
aaa=bbb
set 系统,当前,自定义 工作中不常用
env 系统 工作中不常用
export 显示当前导出成用户变量的shell变量
每个shell都有自己特有的变量,这和用户变量是不同的。当前用户变量和你用什么shell无关,不管你用什么shell都是存在的。比如HOME,SHELL等这些变量,但shell有自己的变量,不同的shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash特有的。
export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变量可以通过export “导出”变成一个用户变量。
2、unix shell的变量分类
在Shell中有三种变量:内部变量,环境变量,用户变量。
内部变量:系统提供,不用定义,不能修改
环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环境变量.
用户变量:用户定义,可以修改
(1)内部变量(系统变量,环境变量,参数变量,预定义变量)
内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
表示方法 描述
$n $1 表示第一个参数,$2 表示第二个参数 ...
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以"参数1 参数2 ... " 形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
(2) 环境变量
Linux环境(也称为shell环境)由许多变量及这些变量的值组成,由这些变量和变量的值决定环境外观。这些变量就是环境变量。
包括两部分,一是,由系统设置的,主要包括: HOME,LOGNAME,MAIL,PATH,PS1,PWD,SHELL,TERM
二是,用户在命令行中设置的,使用export命令,但是用户注销时值将丢失
(3)用户变量(私有变量,本地变量)
在命令行中自己设定的.
8.9 环境变量配置文件
设置变量的三种方法
-
在/etc/profile文件中添加变量【对所有用户生效(永久的)】
-
在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
例如:编辑wangbin用户目录(/home/guok)下的.bash_profile
$ vi /home/wangbin/.bash.profile
- 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
#export NAME=”yuan faxiang”
/etc/profile 系统相关的配置文件,针对所有用户
内设PATH,USER,LOGNAME,MAIL,INPUTRC,HOSTNAME,HISTSIZE,umask,export全局声明等等。
etc/profile里面的声明
It's NOT a good idea to change this file unless you know what you
are doing. It's much better to create a custom.sh shell script in
/etc/profile.d/ to make custom changes to your environment, as this
will prevent the need for merging in future updates.
#cd /etc/profile.d/
#vim path.sh 【.sh 表示这是个配置文件】
写入
#!/bin/bash
export PATH=$PATH:/tmp/:/date/bin
退出
#source /etc/profile
/etc/bashrc 系统级别的变量,针对所有shell,所有用户
bashrc里面的声明,和/etc/profile里面的声明一样
It's NOT a good idea to change this file unless you know what you
are doing. It's much better to create a custom.sh shell script in
/etc/profile.d/ to make custom changes to your environment, as this
will prevent the need for merging in future updates.
主要预设umask以及PS1。PS1是敲命令时,前面那串字符。例如CentOS root用户默认PS1是 [root@localhost~]#。
#echo $PS1
[\u@\h \W]$ 【h后面要有空格】
u 用户
h 主机名
W 当前目录的缩写目录 可以更改为小写w,表示当前路径的绝对路径
$ 符号 #
#PS1='[\u@\h \w]$' 显示绝对路径
更改umask
#umask
0022
#vim /etc/profile.d/umask.sh
!# /bin/bash
umask 0012
#source /etc/profile
#umask
0012
上述是两个系统级别的配置文件,每个用户的家目录下还有几个隐藏文件
#ls -la . |grep bash
.bash_profile 定义当前用户环境变量PATH
定义用户个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登陆时,该文件仅仅执行一次。
.bashrc 定义当前用户别名
包含专用于你的shell的bash信息,当登陆时以及每次打开新的shell时,文件被读取。可以讲用户自定义的alias或者自定义变量写到文件中。
.bash_history
记录命令历史
.bash_logout
退出shell时候,会执行该文件。建议把清理工作放到此文件中。