8.6 管道符和作业控制
1. 管道符“|”
管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
cat 1.txt | wc -l
cat 1.txt |grep 'aaa'
find ./ -type f | wc -l
2. 作业控制
2.1 作业和进程的区别
进程和作业的概念也有区别。一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。
2.2 作业控制
作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。
- 使用 Ctrl + z 停止进程并放到后台
vim 1.txt
[1]+ 已停止 vim 1.txt
vim aa.txt
[2]+ 已停止 vim aa.txt
- 使用jobs命令查看后台所有运行的进程
jobs
[1]- 已停止 vim 1.txt
[2]+ 已停止 vim aa.txt
- 使用fg[id号]将任务调到前台
fg 1
- 再查看进程
jobs
[1]+ 已停止 sleep 200
[2]- 运行中 sleep 100 &
- 使用bg[id号]将任务调到后台,如果进程还在不断刷新运行的话,其实进程没有停止
bg 1
[1]+ vim 1.txt &
[1]+ 已停止 vim 1.txt
- 使用sleep停止
sleep 1000 停止1000秒
jobs
[1] 已停止 vim 1.txt
[2] 已停止 vim aa.txt
[3]- 已停止 sleep 1000
8.7/8.8 shell变量
1. 变量
在shell中有3种变量:系统变量,环境变量和用户自定义变量,其中系统变量在对参数判断和命令返回值判断时会使用,环境变量主要是在程序运行时需要,用户自定义变量在编程过程中使用量最多。==系统内置变量一般都是大写,而自己定义的变量尽量写成小写区分。==
2. 显示系统的内置变量命令 env
env 显示系统的内置变量命(只保留一部分)
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
HISTSIZE=1000
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
...
3. 显示系统内的变量也可以用户自定义变量 set
a=1 自定义变量
1=a 错误的格式
-bash: 1=a: 未找到命令
set |grep 1 查看是1的自定义变量
a=1
4. shell变量的格式
- 变量名规则:可以是字母、数字下划线,首位不能为数字
- 变量值有特殊符号时需要用单引号括起来,比如 a='a b c',a='a$b#C'
- 尽量少用大写字母,因为大写字母大多都是系统的一些变量
- 有很多特殊的关键字,最好不要用作变量名,比如 if for do done
- 变量的累加
a=1
b=2
echo $a$b
12
a='a$bc'
echo $a$b
a$bc2
c="a$bc" **?是$bc没定义,不能识别的原因吗?**
echo $c
a
c="a$b"c
echo $c
a2c
c='a$b'c
echo $c
a$bc
a=a"$b"c 学会这样使用"",是命令更清晰
- 全局变量
export命令 设置或显示环境变量 在shell中执行程序时,shell会提供一组环境变量,这也使shell变量只能在当前使用。export可新增,修改或删除环境变量,供后续执行的程序使用,已达到使shell达到类似全局变量的目的。export的效力仅及于该此登陆操作,shell退出时失效。
==父shell中定义的NAME环境变量传递到了子shell中,在子shell中定义的NAME环境变量没有被带到父shell中。 如何改变呢?==
- 永久的:需要修改/etc/profile配置文件,export变量永久生效。
打开这个文件后,会看到里面有很多已经定义好的变量,按照格式把自定义变量写入进去,然后source /etc/profile重启服务就可以生效了
- 临时的:使用export命令进行全局行声明即可,变量在关闭shell时失效
aming=linux
echo $aming
linux
bash 进入bash
echo $aming
无结果
exit 退出bash
export aming=linux 全局声明
bash
echo $aming
linux
- 查看当前用户在哪个shell中 pstree命令 pstree命令可以把linux系统中所有进程通过树形结构打印出来
pstree |grep bash
|-login---bash
|-sshd---sshd---bash-+-grep
bash
pstree |grep bash
|-login---bash
|-sshd---sshd---bash---bash-+-grep
- 取消变量 unset命令
unset + 变量名 把设置的变量取消掉
echo $aming
linux
unset aming
echo $aming
8.9 环境变量配置文件
1. 系统级环境变量配置文件
/etc/profile 用户环境变量,交互,登录才执行
/etc/bashrc 用户不用登录,执行shell就生效
2. 普通用户级境变量配置文件
~/.bashrc 该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
~/.bash_profile 定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
~/.bash_history 记录命令历史用的。
~/.bash_logout 当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。