管道符和作业控制
[root@localhost ~]# cat a.txt
-bash: lsaaa: 未找到命令
-bash: lsaaa: 未找到命令
- [root@localhost ~]# cat a.txt|wc -l
- 2
- [root@localhost ~]# cat a.txt|grep 'aaa'
-bash: lsaaa: 未找到命令
-bash: lsaaa: 未找到命令
* 将前面的结果交给后面的命令执行
Ctrl+z 临时暂停正在执行的进程 (调向后台)
[root@localhost ~]# vim 2.txt
[1]+ 已停止 vim 2.txt
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用 % 挂载点
- /dev/sda3 28G 1.4G 27G 5% /
- devtmpfs 479M 0 479M 0% /dev
- tmpfs 489M 0 489M 0% /dev/shm
- tmpfs 489M 6.7M 482M 2% /run
- tmpfs 489M 0 489M 0% /sys/fs/cgroup
- /dev/sda1 197M 97M 100M 50% /boot
- tmpfs 98M 0 98M 0% /run/user/0
- [root@localhost ~]# fg 将后台进程调回前台
- vim 2.txt
- [root@localhost ~]# vim aa.txt
[2]+ 已停止 vim aa.txt
- [root@localhost ~]# fg
- vim aa.txt
[2]+ 已停止 vim aa.txt
[root@localhost ~]# jobs 将已经停止的后台任务列出
[1]- 已停止 vim 2.txt
[2]+ 已停止 vim aa.txt
- [root@localhost ~]# fg 2 多进程在后台时调回一个进程 (fg+id 号)
- vim aa.txt
- [root@localhost ~]jobs
[1]- 已停止 vim 2.txt
[2]+ 已停止 vim aa.txt
[3] 运行中 vmstat 1 &
[root@localhost ~]fg 3
[root@localhost ~]vmstat 1 该进程会不停的在屏幕上输出信息, 按 ctrl+z 进程停止, 敲 bg 进程会在后台运行起来
[root@localhost ~]# jobs
[3]- 已停止 vmstat 1
[4]+ 已停止 vim aa
- [root@localhost ~]# bg 4
- [4]+ vim aa &
- [root@localhost ~]# jobs
[3]- 已停止 vmstat 1
[4]+ 已停止 vim aa
* 有的命令在后台只能是停止状态 (vim), 有些命令按 ctrl+z 会被放在后台并停止, 但使用 bg+id 可以使这种命令在后台运行起来 (vmstat 1)
[root@localhost ~]# sleep 1000 在这 1000 秒内什么也不做
Ctrl+z 停止进程, 暂停这种状态
- [root@localhost ~]#
- [root@localhost ~]# sleep 200
- ^Z
[6]+ 已停止 sleep 200
[root@localhost ~]# jobs
[3] 已停止 vmstat 1
[4] 已停止 vim aa
[5]- 已停止 sleep 1000
[6]+ 已停止 sleep 200
- [root@localhost ~]# fg
- sleep 200
fg 后不加任何内容则将最新被停止的进程拉到前台执行
- [root@localhost ~]# bg 6
- [6]+ sleep 200 &
- [root@localhost ~]# jobs
[3] 已停止 vmstat 1
[4]- 已停止 vim aa
[5]+ 已停止 sleep 1000
[6] 运行中 sleep 200 &
被执行了 bg 的停止进程会在后台重新运行起来
- [root@localhost ~]# sleep 100 &
- [7] 1112
[6] 完成 sleep 200
[root@localhost ~]# jobs
[3] 已停止 vmstat 1
[4]- 已停止 vim aa
[5]+ 已停止 sleep 1000
[7] 运行中 sleep 100 &
[root@localhost ~]#
将一条命令直接丢到后台执行
*Jobs 命令只能发现目前终端下的被放在后台的进程
- [root@localhost ~]# ps aux |grep sleep
- root 1109 0.0 0.0 107904 612 pts/0 T 21:32 0:00 sleep 1000
- root 1115 0.0 0.0 112676 984 pts/0 S+ 21:43 0:00 grep --color=auto sleep
[7] 完成 sleep 100
Shell 变量
查看变量
- [root@localhost ~]# env 查看系统常用的环境变量
- XDG_SESSION_ID=4
- HOSTNAME=localhost.localdomain
- SELINUX_ROLE_REQUESTED=
- TERM=xterm
- SHELL=/bin/bash
- HISTSIZE=2000
- [root@localhost ~]# set 查看系统内置环境变量和用户自定义变量
- [root@localhost ~]# a=111 自定义变量
- [root@localhost ~]# set |grep '111' 以 111 为条件在 set 的结果下查找
- PPID=1118
- a=111
- [root@localhost ~]# env |grep 'a=111' env 无法搜索自定义变量
- [root@localhost ~]#
- [root@localhost ~]# env |grep HOSTNAME
- HOSTNAME=localhost.localdomain
系统变量通常不能修改 (可以通过配置文件更改), 自定义变量是用户自己定义的变量;
变量名可以是字母数字下划线, 变量名不能以数字开头;
变量值有特殊符号时需要用单引号括起来
- [root@localhost ~]# a1=2
- [root@localhost ~]# echo $a1
- 2
- [root@localhost ~]# _a1=3
- [root@localhost ~]# echo $_a1
- 3
- [root@localhost ~]# 1a1=4
-bash: 1a1=4: 未找到命令
[root@localhost ~]# g=a b c
-bash: b: 未找到命令
- [root@localhost ~]# g='a b c'
- [root@localhost ~]# h="a$bc"
- [root@localhost ~]# echo $h
- a
- [root@localhost ~]# h='a$bc' 中无论任何特殊符号都会原样输出
- [root@localhost ~]# echo $h
- a$bc
单引号:
可以说是所见即所得: 即将单引号内的内容原样输出, 或者描述为单引号里面看见的是什么就会输出什么
双引号:
把双引号内的内容输出出来; 如果内容中有命令, 变量等, 会先把变量, 命令解析出结果, 然后在输出最终内容来
双引号内命令或变量的写法为 ` 命令或变量 ` 或 $(命令或变量)
无引号:
把内容输出出来, 可能不会讲含有空格的字符串视为一个整体输出, 如果内容中有命令, 变量等, 会先把变量, 命令解析结果, 然后在输出最终内容来, 如果字符串中带有空格等特殊字符, 则不能完整的输出, 需要改加双引号, 一般连续的字符串, 数字, 路径等可以用, 不过最好用双引号替代之
- [root@localhost ~]# c="a$b"c 中的变量命令会先被执行再输出
- [root@localhost ~]# echo $c
- a3c
- [root@localhost ~]#
全局变量
- [root@localhost ~]# w 查看当前系统用户登录情况
- 22:36:39 up 2:07, 3 users, load average: 0.00, 0.01, 0.02
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root tty1 20:30 2:06m 0.02s 0.02s -bash
- root pts/0 192.168.91.1 20:30 40:55 1.45s 0.14s -bash
- root pts/1 192.168.91.1 21:45 7.00s 0.09s 0.02s w
- [root@localhost ~]# echo $SSH_TTY 通过环境变量查看自己在哪个 tty 下
- /dev/pts/1
- [root@localhost ~]# echo $SSH_TTY
- /dev/pts/1
- [root@localhost ~]# hyc=linux
- [root@localhost ~]# echo $hyc
- linux
- [root@localhost ~]# echo $SSH_TTY
- /dev/pts/0
- [root@localhost ~]# echo $hyc
在一个 tty 下定义的变量在另一个 tty 下不生效
[root@localhost ~]# pstree
* 重新打开一个 bash(子 shell) 执行 pstree 命令
- [root@localhost ~]# echo $hyc 打开的两个子 shell 并没有继承自定义变量 hyc
- [root@localhost ~]# exit
- exit
- [root@localhost ~]# echo $hyc
- [root@localhost ~]# exit
- exit
- [root@localhost ~]# echo $hyc 退出到最初的 shell
- linux
之前自定义的变量只在本地生效
定义全局变量
- [root@localhost ~]# export aming=linux
- [root@localhost ~]# echo $aming
- linux
- [root@localhost ~]# bash
- [root@localhost ~]# echo $aming
- Linux
全局变量向下生效, 该 shell 下配置的全局变量只在该 shell 的子 shell 及以下的 shell 中生效;
不同 sshd 的全局变量互不影响;
- [root@localhost ~]# unset aming 取消自定义的变量
- [root@localhost ~]# export yy=aa
- [root@localhost ~]# echo $yy
- aa
- [root@localhost ~]# bash
- [root@localhost ~]# echo $yy
- aa
- [root@localhost ~]# unset yy
- [root@localhost ~]# echo $yy
子 shell 可以删除从上级 shell 获得的全局变量
环境变量配置文件
系统层次配置文件
/etc/profile /etc/bashrc
用户层次
~/.bashrc ~/.bash_history ~/.bash_logout ~/.bash_profile
Profile 是用户登录才生效;
bashrc 在系统执行 shell 时就生效, 此时用户可以不用登录
如果需要变量全局生效则在 / etc 下编辑对应文件, 如果只针对某个用户生效则在用户家目录下编辑对应文件
~/.bash_logout 定义用户每次登出时执行的操作
变量 PS1
[root@localhost ~] 受 PS1 影响
- [root@localhost ~/d6z/hyc]#echo $PS1
- [\u@\h \w]\$
- [root@localhost ~/d6z/hyc]#PS1='[\u@\h \W]\$'
- [root@localhost hyc]#
W 小写代表绝对路径, 大写代表相对路径
- [root@localhost hyc]#PS1='<\u@\h \W>\$' [] 可代替为其他任意符号或消除
- <root@localhost hyc>#
设置使括号内容带颜色
变量 PS2
例如进入 mysql 会进入一个小终端, 此时一行开头显示的内容会用到变量 PS2
- root@localhost ~]#echo $PS2
- >
- root@localhost ~]#for i in `seq 1 100` 进入 PS2
- >
- > done
-bash: 未预期的符号 `done' 附近有语法错误
- root@localhost ~]#PS2="#"
- root@localhost ~]#for i in `seq 1 100`
- #
来源: http://www.bubuko.com/infodetail-2520794.html