一、管道符和作业控制
1、管道符: | (把前面命令输出的结果给后面的命令) 统计ls命令后有多少个文件: ls |wc -l 列出/etc/目录下有多少个文件:find /etc/ -type f |wc -l
2、作业控制: ctrl + z 暂停一个任务, 恢复用命令:fg 如果有多个暂停任务,我们可以用fg +id恢复某个任务 jobs 列出已暂停的任务 bg +id, 让它到后台去运行。 vmstat 1(让系统不停的显示某些信息) sleep 1000暂停1000s sleep 1000 & 让它到后台继续工作 查看进程的命令:ps aux |grep sleep
二、shell变量
1、变量: 变量名的规则:首位不能为数字,变量名只能是字母(a-z A-Z),数字(0-9),下划线(_)的组合; 变量值有特殊符号的时候要用单引号括起来。
env 命令:查看系统的变量的名字,显示的变量只是环境变量。 set 命令: 查看系统跟用户自定义的变量
PATH 该变量决定了shell将到哪些目录中寻找命令或程序 HOME 表示当前用户的主目录 PWD 表示当前目录 LOGNAME 表示当前用户的登陆名 HOSTNAME 表示主机的名称 LANG 表示与语言相关的环境变量 MAIL 表示当前用户的邮件存放目录 SHELL 表示当前的用户shell类型 HISTSIZE 表示历史记录数
2、自定义变量: 例: a=2222 echo $a
3、变量的累加: a=1 b=2 echo $a$b ————————————————
a="$b"c 当赋值为变量的时候要用双引号,而不是单引号。 b=3 echo $a$b
6、全局变量 1、使用bash命令可以再打开一个shell,先前自定义的变量已经不存在了,允许系统内所有用户登录后都能使用该变量,具体的操作方法是:在/etc/profile文件最后一行加入 export a=fliename ,然后运行 source /etc/profile就生效了。 (运行bash命令,则会在当前shell中进入一个新的shell,这个新的shell是原来shell的子shell,我们可以用pstree |grep bash 来查看(安装pstree: yum install psmisc),pstree 命令可以把linux系统中所有的进程以树形结构显示出来)
2、仅允许当前用户使用该变量,在用户主目录下的.bashrc文件最后一行加入 export a=filename ,运行source .bashrc 就生效了。
export 命令就是声明一下变量,让子shell也知道我们自定义的变量。
7、取消变量。 unset +变量名
三、环境变量的配置文件
(若要配置环境变量之类,最保险是写在 .bashrc 文件中。因为不管是登陆还是不登陆,该文件总会被调用!) 1、系统层次(/etc/下面的) /etc/profile 用户环境变量,交互、登陆时自动运行 /etc/bashrc 用户不用登陆,执行shell就自动运行
2、用户层次(/root/下面的) 〜/.bash_profile 该文件定义了用户的个人化路径和环境变量的名称,当用户登陆时,该文件仅执行一次 〜/.bashrc 该文件包含专属自己的shell的bash信息,当登录或每次打开新的shell时,被读取。
profile 与bashrc它们的差别在于:profile是在用户登陆系统时自动加载的,bashrc 是执行shell脚本的时候,系统就会调用bashrc文件。 〜/.bash_logout 用来定义用户退出的时候需要做的一些操作;
3、$PS1 变量:(就是我们命令提示符前面的内容) 在/etc/bashrc里面定义的, 1、echo $PS1 2、我们可以改变它的变量,例去掉它的[ ], PS1='\u@\h \W$' 如果把大w改成小w,它后面的目录就变成绝对路径了。如图:
还有个环境变量:PS2 echo $PS2
扩展:
一、有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?本文教你一招
1.mkdir -p /usr/local/domob/records/
chmod 777 /usr/local/domob/records/
chmod +t /usr/local/domob/records/
2.vi /etc/profile 在最后添加下面的代码
if [ ! -d /usr/local/domob/records/${LOGNAME} ]
then
mkdir -p /usr/local/domob/records/${LOGNAME}
chmod 300 /usr/local/domob/records/${LOGNAME}
fi
export HISTORY_FILE="/usr/local/domob/records/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print $1" "$2" "$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'
二、Bash 在显示 PS1 之前先执行 PROMPT_COMMAND 定义的内容: ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S"
22:08:42 ramesh@dev-db ~>
[注: PROMPT_COMMAND 和 PS1 在不同行显示] 如果你想让 PROMPT_COMMAND 和PS1 在同一行显示,用 -n 参数即可: ramesh@dev-db ~> export PROMPT_COMMAND="echo -n [$(date+%k:%m:%S)]" [22:08:51]ramesh@dev-db ~>
[注: PROMPT_COMMAND 和 PS1 在同一行显示]