10月12日任务
8.6 管道符和作业控制
管道符|
将前一个指令的输出作为后一个指令的输入。
#cat 1.txt |wc -l
[root@centos7 ~]# cat 1.txt |wc -l 统计行数
2
[root@centos7 ~]# ls
1.txt 1.xtx 2.txt 3.txt 4.txt a_(2).txt AA.txt anaconda-ks.cfg anaconda-ks.cfg.1 a.txt A.txt bb.txt err temp.1
[root@centos7 ~]# ls |wc -l 统计文件数量
14
#cat 1.txt |grep 'aaa'在1.txt中过滤'aaa',并显示出相关'aaa'的信息。
ctrl z暂停一个任务
假如,在使用#vim 1.txt写入信息时,想退出当前vim窗口去做其他操作又不想影响数据录入,又不想wq退出。这时候可以使用ctrl z去把任务暂停。
[root@centos7 ~]# vim 1.txt
[1]+ 已停止 vim 1.txt
[root@centos7 ~]# cat 1.txt
1.txt
2.txt
jobs查看后台的任务
# jobs
[1]- 已停止 vim 1.txt
[2]+ 已停止 vim a.txt
fg[id]把任务调到前台
#fg 可以把被暂停的任务调出来,如果多个被暂停,需要加入ID号即可调出。例如暂停了2个任务,把第二个任务调出来,如下操作:
#fg2
# fg 2
vim a.txt
[2]+ 已停止 vim a.txt
bg[id]把任务调到后台
退出fg2先
#fg2 进入第二个vim,q或者wq退出。
[root@centos7 ~]# jobs
[1]+ 已停止 vim 1.txt
用vmstat 1来测试,#vmstat1命令:不停自动显示系统状态
#vmstat1
ctrl z停止,使用#bg调到前台
#jobs
期间可以敲命令 可以正常使用,只是影响显示。
现在要把vmsta1调到前台,
首先把fg1退出
#fg 进去把之前的vim暂停任务退出,q!
#jobsvmstat1
#fg把vmstat 1调到前台
#jobs运行中
ctrl c退出
#jobs无任务。
示例2
#sleep 1000暂停1000秒
^Z
[1]+ 已停止 sleep 1000
#jobs 已停止状态
# jobs
[1]+ 已停止 sleep 1000
#sleep 200
#jobs两个停止状态
#fgfg不加ID号,会自动识别成:fg 最后一次暂停
ctrl z 暂停
# bg 1放到后台。
[1]- sleep 1000 &
#jobs
# jobs
[1]- 运行中 sleep 1000 &
[2]+ 已停止 sleep 200
退出两个sleep命令
#fg1 + ctrl c
#fg2 + ctrl c
命令后面加&直接丢到后台
#sleep 100 &
8.7/8.8 shell变量
变量
例如环境变量PATH,它是shell预设的一个变量。
shell预设的变量都是大写的。
变量就是使用一个简单的字符串来替代某些具有特殊意义的设定以及数据。
就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。
有了PATH这个变量,我们运行某个命令时,就不再需要输入全局路径,直接输入命令名即可。
env命令
HOSTNAME主机名
SHELL表示当前用户的shell类型
HISTSIZE你是记录数
MAIL当前用户的邮件存放目录
PATH该变量决定了shell将到哪些母驴寻找命令程序。
LANG语言
HOME 家目录
LOGNAME当前用户登录名
PWD当前目录
set命令多了很多变量,并且包括用户自定义的变量
自定义变量a=1
[root@centos7 ~]# a=111
[root@centos7 ~]# echo $a
111
在set里可以过滤出刚刚设了值为a=111
# set |grep 111
a=111
或者 #set |less
在set下面/搜索a=111
/a=111
#env下面没有a=111值,因为不会被保存到env里
变量名规则:字母、数字下划线,首位不能为数字
a2=111
_a2=111这两个都可以
2a=111这个不行
变量值有特殊符号时需要用单引号括起来(“”双引号也可以,不过建议用‘’因为可以脱意)
[root@centos7 ~]# a='a b c'
[root@centos7 ~]# echo $a
a b c
下例演示值为a=a$bc 没脱意与脱意的效果
[root@centos7 ~]# a="a$bc"
[root@centos7 ~]# echo $a
a使用"",不能脱意
[root@centos7 ~]# a='a$bc'
[root@centos7 ~]# echo $a
a$bc使用'',脱意
变量的累加
演示$代表累加,连着显示。
[root@centos7 ~]# a=1
[root@centos7 ~]# b=2
[root@centos7 ~]# echo $a$b
12
[root@centos7 ~]# c="a$bc"
[root@centos7 ~]# echo $c
a
[root@centos7 ~]# c="a$b"c
[root@centos7 ~]# echo $c
a2c
[root@centos7 ~]# c=a"$b"c c="a$b"c与 c=a"$b"c 是两个一样的效果。命令c="a$b"c的第一个"会被移动a后面,演变成了c=a"$b"c,所以两者效果一样。
[root@centos7 ~]# echo $c
a2c
全局变量export b=2
unset变量
-------------------------------------------------------------------------------
全局变量export b=2
先打开2个终端(0号和1号)
查看当前窗口位于哪个tty下
先w查看登录信息
[root@centos7 ~]# w
17:40:31 up 7:46, 3 users, load average: 0.02, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 09:56 7:43m 0.08s 0.08s -bash
root pts/0 192.168.189.1 09:57 7.00s 0.44s 0.00s w
root pts/2 192.168.189.1 17:38 2:11 0.01s 0.01s -bash
利用$SSH_TTY 查看当前tty
0号查看
echo $SSH_TTY
/dev/pts/0
1号查看
# echo $SSH_TTY
/dev/pts/2
在0号建立变量aming=linux
[root@centos7 ~]# aming=linux
[root@centos7 ~]# echo $aming
linux
在1号使用变量aming=linux
[root@centos7 ~]# echo $aming
在0号使用#bash进入一个子shell,然后#pstree查看当前bash位置
#bash(shell其实就等于一个进程,如果#bash,等于进入一个新的bash)
#pstree
详解此段ssh-bash-bash-pstree
首先通过ssh获得了一个bash(第一个bash,主shell),然后#bash(第二个bash,子shell),再在第二个bash执行了pstree命令
0号和1号都是无变量值
[root@centos7 ~]# echo $aming 无变量值
#exit退出刚刚建立的#bash(子shell),返回第一个bash,主shell。#echo有变量值
[root@centos7 ~]# exit
exit
[root@centos7 ~]# echo $aming
linux
这种变量叫非全局、本地local变量,仅仅在当前终端(sshd)生效。
全局变量 export aming=linux
在使用全局变量后,新加shell也是可以使用该变量,仅仅在当前终端(sshd)生效。。
[root@centos7 ~]# export aming=linux
[root@centos7 ~]# echo $aming
linux
[root@centos7 ~]# bash进入一个新shell
[root@centos7 ~]# echo $aming
linux成功
演示2
[root@centos7 ~]# export b=2
[root@centos7 ~]# echo $b
2
[root@centos7 ~]# exit
exit
[root@centos7 ~]# echo $aming
linux
[root@centos7 ~]# echo $b
空
为什么这里是空,原因很简单。是因为shell生成原理是基础shell向下生成子shell,孙shell,以此类推。而exit是退出shell,属于向上,往上动作,所以此时全局变量是不会生效的。所以为什么exit退出shell时,echo $aming生效 而echo $b不生效,是因为echo $aming处于的shell比echo $b还要往上,而shell是往下生成,所以echo $b不生效。
unset变量
# unset $aming
# unset $b取消 $b的变量
8.9 环境变量配置文件、
两大围度
系统层次
/etc/profile用户环境变量,交互,登录才执行
这个文件预设了几个重要的变量。例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。
高亮用户层次
/etc/bashrc用户不用登录,执行shell就生效
这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符[root@centos7 ~]# 。
[root@centos7 ~]# echo $PS1查看PS1的变量
[\u@\h \W]\$ 对应是\u=user @h=hostnae \W=目录的最后一层。
可以更改PS1的值,把W改成w,效果是显示绝对路径
#PS1='[\u@\h \w]\$ '注意,有特殊符号需要加''来脱意
#echo PS1
[\u@\h \w]\$
可以更改改颜色参数
PS1='\[\033[01;32m\]\u@\h\[033[00m\]:\[033[01;36\]\w\[\033[00m\]\$ '
~/.bashrc
该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。例如,可以将用户自定义的别名或者自定义变量写到这个文件中。
~/.bash_profile
.跟#source是一样的效果,例如
#. .bash_profile = #source .bash_profile
定义用户的个人化路径与环境变量的文件名称。每个用户都可以使用该文件输入属于自己的shell信息,当用户登录时,该文件仅仅执行一次。
~/.bash_history
用于记录命令历史。
~/.bash_logout
退出shell时,用户退出时将要做的操作。。
扩展
bashrc和bash_profile的区别 http://ask.apelearn.com/question/7719
简易审计系统: http://www.68idc.cn/help/server/linux/2014042190951.html
关于PROMPT_COMMAND环境变量的含义 http://www.linuxnote.org/prompt_command-environment-variables.html
来源:oschina
链接:https://my.oschina.net/u/3960075/blog/2244908