10月12日任务
8.6 管道符和作业控制
8.7/8.8 shell变量
8.9 环境变量配置文件
管道符 |
管道符的作用: 将其左边命令的输出作为右边命令的输入
例如:
[root@localhost ~]# cat /etc/passwd | grep 'root'root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin
作业控制
- ctrl + Z 可以让运行的进程暂停
# sleep命令 休眠命令[root@centos7 ~]# sleep 100^Z[1]+ 已停止 sleep 100[root@centos7 ~]# sleep 200^Z[2]+ 已停止 sleep 200[root@centos7 ~]# sleep 1000^Z[3]+ 已停止 sleep 1000
- jobs 查看后台进程
# 查看后台的命令进程[root@centos7 ~]# jobs[1] 已停止 sleep 100[2]- 已停止 sleep 200[3]+ 已停止 sleep 1000
- fg 将后台进程调用到前台运行
# fg ID 调用特定的进程,让其在前台运行,不加ID默认调用最后一个[root@centos7 ~]# fg 2sleep 200^Z[2]+ 已停止 sleep 200
- bg 将前台进程调到后台运行,前台可以执行其他命令
[root@localhost ~]# bg 1[1] sleep 100 &[root@localhost ~]# jobs[1] 运行中 sleep 100 &[2]- 已停止 sleep 200[3]+ 已停止 sleep 1000
- & 使进程后台运行
# &符号,让命令在后台运行,可以使用fg命令调出至前台[root@centos7 ~]# sleep 10 &[4] 1037
shell变量
环境变量:PATH、HOME、PWD、LOGNAME... SSH_TTY(当前终端号)
获取当前系统下的变量
- env 命令(获取的是系统内置环境变量)
# root用户的系统系统环境变量,其他用户稍有不同;env命令不会显示用户自定义的变量![root@centos7 ~]# envXDG_SESSION_ID=1HOSTNAME=centos7SELINUX_ROLE_REQUESTED=TERM=xtermSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=192.168.65.1 50839 22SELINUX_USE_CURRENT_RANGE=SSH_TTY=/dev/pts/0USER=root...
- set命令(除了系统内置的环境变量还会显示用户自定义的变量)
[root@localhost ~]# setBASH=/bin/bashBASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_ALIASES=()BASH_ARGC=()BASH_ARGV=()BASH_CMDS=()BASH_LINENO=()BASH_SOURCE=()BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")BASH_VERSION='4.2.46(1)-release'COLUMNS=74DIRSTACK=()EUID=0GROUPS=()HISTCONTROL=ignoredupsHISTFILE=/root/.bash_historyHISTFILESIZE=1000HISTSIZE=1000HOME=/rootHOSTNAME=localhost.localdomainHOSTTYPE=x86_64ID=0IFS=$' \t\n'LANG=zh_CN.UTF-8...
变量命名规则
[root@localhost ~]# a_1=111[root@localhost ~]# echo $a_1111
- 由字母、数字、下划线组成,且首位不能为数字
变量的值
[root@localhost ~]# a='a b c'[root@localhost ~]# echo $aa b c
- 值包含特殊符号,使用单引号包括(空格、$、#等)
变量的累加
[castiel@centos7 ~]$ a=1[castiel@centos7 ~]$ b=2[castiel@centos7 ~]$ echo $a$b12# 单引号会保留特殊符号[castiel@centos7 ~]$ a='a$bc'[castiel@centos7 ~]$ echo $aa$bc#双引号会对特殊符号进行换算,在此之前,bc变量不存在,所以b=a[castiel@centos7 ~]$ b="a$bc"[castiel@centos7 ~]$ echo $ba# 当前$b为a,c变量被赋值为aac[castiel@centos7 ~]$ c="a$b"c[castiel@centos7 ~]$ echo $caac
全局变量
# 查看当前登录的终端[root@localhost ~]# echo $SSH_TTY/dev/pts/0
- 全局变量:在系统某个终端shell及其生成的子shell内都存在的变量;
- 自定义变量:只在当前终端下有效的变量;
export
命令可以将shell内自定义的变量变为全局变量,但是需要注意的是 export命令只在当前shell及其子shell
下有效,在其父shell
内是无效的!!!
归纳总结
- 使用export命令生成的全局变量,在父shell内是无效的!
- 在脚本内执行export命令可以使由脚本生成的子shell共享自定义变量;
- pstree命令可以查看当前shell在整个进程树的位置(yum install psmics)
# 子shell内设置全局变量a,在其(上行)父shell内该变量无效,其他终端的shell内也无效![root@centos7 ~]# bash[root@centos7 ~]# export a=123[root@centos7 ~]# exitexit[root@centos7 ~]# echo $a# 在当前shell内设置全局变量,其子shell内也有效[root@centos7 ~]# export a=123[root@centos7 ~]# echo $a123[root@centos7 ~]# bash[root@centos7 ~]# echo $a123
环境变量配置文件
系统层次
/etc/profile
用户环境变量,在交互、登录login时才执行/etc/bashrc
交互non-login,执行shell就生效
用户层次
~/.bashrc
~/.bash_profile
~/.bash_history
当前shell内执行命令的历史记录~/.bash_logout
用户退出登录时执行的操作
# 在用户退出时清空其历史命令记录[root@localhost ~]# echo "echo > ~/.bash_history" >> ~./bash_logou
用户的某些自定义需求命令可以通过储存在.bashrc
或.bash_profile
文件内,使之在每次登录shell时生效!!同样的也可以设置在.bash_logout
文件内,使之退出后生效。
login和non-login shell的区别
-
在机器上直接用户密码登录,使用
ssh
或su
切换用户登录---login -
不登录系统而使用
ssh
直接在远程执行命令---non-login -
登录系统后,打开一个新的teminal,该terminal登录为non-login !
login shell 调用.bash_profile文件non-login shell 调用.bashrc文件!注意:.bash_profile文件执行时也会调用.bashrc
结论:要想某些设置一定被shell调用,最好将其写入bashrc
文件中!!!
提示符
- PS1 默认的提示符
[root@centos7 ~]# echo $PS1[\u@\h \W]\$\u 当前用户\h hostname\W 当前目录(相对路径)\w 当前目录(绝对路径)\$ root为#,普通用户$
- PS2 多行连续输入换行行首提示符(例如for循环)
[root@centos7 ~]# echo $PS2>
- PS3 shell脚本使用
select
时的提示符
[root@centos7 ~]# echo $PS3
- PS4 使用
set -x
跟踪命令执行时的输出前缀
[root@centos7 ~]# echo $PS4+