6.29任务

8.6 管道符和作业控制

管道符|,表示把它之前命令的输出的内容传递给其之后的命令作为输入。

cat 1.txt | grep 'aaa'
即把1.txt的内容交给grep过滤,grep过滤出所有带有aaa字符串的行。

 这种例子有很多,使用管道符真的很方便。

[root@localhost tmp]# ls
d6z                                                                       yum_save_tx.2018-06-27.02-59.QTteas.yumtx  yum_save_tx.2018-06-27.04-11.nmEoYu.yumtx
systemd-private-9344f4c4772e41cb8792b31949b23270-chronyd.service-V0zGzQ   yum_save_tx.2018-06-27.03-21.tQJvGu.yumtx  yum_save_tx.2018-06-27.04-47.AZATQH.yumtx
systemd-private-9344f4c4772e41cb8792b31949b23270-vgauthd.service-pqGgb9   yum_save_tx.2018-06-27.04-06.EwPZ1L.yumtx  zsh-5.0.2-28.el7.x86_64.rpm
systemd-private-9344f4c4772e41cb8792b31949b23270-vmtoolsd.service-tGI20r  yum_save_tx.2018-06-27.04-08.EIlq4S.yumtx
xxx                                                                       yum_save_tx.2018-06-27.04-10.j_S76d.yumtx
[root@localhost tmp]# ls | wc -l
13
[root@localhost tmp]# find ./ -type f | wc -l
34

管道符很常用,在之后的学习中会越来越熟悉。

之前讲过一个快捷键ctrl-z,可以暂停一个任务。

比如我在vim编辑一个文件,我想出去查看一下另一个文件等,我不想退出编辑,就可以使用Ctrl-z暂停

[root@localhost tmp]# vim xxx 

[1]+  Stopped                 vim xxx
[root@localhost tmp]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        16G  1.7G   15G  11% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  8.7M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1       197M  157M   40M  80% /boot
tmpfs           379M     0  379M   0% /run/user/0

被暂停的任务会被保存到后台。

使用jobs命令可以看到后台所有的任务。

[root@localhost tmp]# jobs
[1]+  Stopped                 vim xxx

想把任务调入前台,使用命令fg

[root@localhost tmp]# fg
vim xxx

如果有多个任务在后台,只需要添加需要调入前台的命令的id号

[root@localhost tmp]# vim 1.txt

[1]+  Stopped                 vim 1.txt
[root@localhost tmp]# vim 2.txt

[2]+  Stopped                 vim 2.txt
[root@localhost tmp]# jobs
[1]-  Stopped                 vim 1.txt
[2]+  Stopped                 vim 2.txt
[root@localhost tmp]# fg 1
vim 1.txt

除了fg命令,还有bg命令。可以看到之前的工作在后台都是停止状态。

那么我想让他在后台自己运行。

[root@localhost tmp]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3516780   2084 190200    0    0    33     3   46   38  0  0 99  0  0
 0  0      0 3516756   2084 190236    0    0     0     0   69   52  0  0 100  0  0
 0  0      0 3516756   2084 190236    0    0     0     0   42   35  0  0 100  0  0
 0  0      0 3516764   2084 190236    0    0     0     0   55   49  0  0 100  0  0
^Z
[3]+  Stopped                 vmstat 1
[root@localhost tmp]# bg
[3]+ vmstat 1 &
[root@localhost tmp]#  2  0      0 3516764   2084 190236    0    0     0     1 1273 1109  0  0 100  0  0
 0  0      0 3516764   2084 190236    0    0     0     0   77   60  0  0 100  0  0
jobs
[2]+  Stopped                 vim 2.txt
[3]-  Running                 vmstat 1 &
[root@localhost tmp]#  0  0      0 3516764   2084 190236    0    0     0     0  106   95  0  0 100  0  0
 0  0      0 3516764   2084 190236    0    0     0     0   48   42  0  0 100  0  0
 0  0      0 3516764   2084 190236    0    0     0     0   52   47  0  0 100  0  0
 0  0      0 3516764   2084 190236    0    0     0     0   48   39  0  0 100  0  0
 0  0      0 3516764   2084 190236    0    0     0     0   56   50  0  0 100  0  0

可以看到vmstat命令是running状态。

还有一个命令是sleep,它的作用就是延时。

[root@localhost tmp]# sleep 20
^Z
[1]+  Stopped                 sleep 20
[root@localhost tmp]# jobs
[1]+  Stopped                 sleep 20
[root@localhost tmp]# bg
[1]+ sleep 20 &
[root@localhost tmp]# jobs
[1]+  Running                 sleep 20 &

这个可以很好的延时bg的作用。20秒之后,任务结束就显示为Done了。

[root@localhost tmp]# jobs
[1]+  Done                    sleep 20

当然了,可以发现使用命令+&形式,可以直接把任务丢到后台。

[root@localhost tmp]# sleep 100 &
[1] 1478
[root@localhost tmp]# jobs
[1]+  Running                 sleep 100 &

打开新的终端,使用jobs并不能发现有后台任务,但是我们可以查询进程号。

[root@localhost tmp]# jobs
[root@localhost tmp]# ps aux | grep sleep
root      1478  0.0  0.0 107948   352 pts/0    S    10:40   0:00 sleep 100
root      1480  0.0  0.0 112704   976 pts/0    S+   10:41   0:00 grep --color=auto sleep

8.7/8.8shell变量

在学习环境变量PATH的时候,曾经介绍过它是系统内置的变量,它就属于shell的变量。

除了PATH还有很多变量,如LANG、HOME等,

可以通过命令env获得系统的环境变量。

[root@localhost tmp]# env | head
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.16.1 12989 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root

除了env还有set命令也可以查询到用户自定义的变量、脚本等。

[root@localhost tmp]# set | head
ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_REMATCH=()

当然可以自定义变量,直接在bash里写就可以。

[root@localhost tmp]# a=111
[root@localhost tmp]# echo $a
111
[root@localhost tmp]# set | grep 'a=1'
a=111

用户自定义的变量是写在set内的。

变量名的规则:字母数字下划线,但是首位不能是数字,变量的值有特殊符号需要用单引号括起来

[root@localhost tmp]# 2a=111
-bash: 2a=111: command not found
[root@localhost tmp]# a=i*
[root@localhost tmp]# echo $a
i*
[root@localhost tmp]# a=b c d
-bash: c: command not found
[root@localhost tmp]# echo $a
i*
[root@localhost tmp]# a='b c d'
[root@localhost tmp]# echo $a
b c d

单引号可以自动脱意。

[root@localhost tmp]# aa=1
[root@localhost tmp]# b=2
[root@localhost tmp]# echo $aa
1
[root@localhost tmp]# echo $b
2
[root@localhost tmp]# aa='a$bc'       //单引号就是a$bc
[root@localhost tmp]# echo $aa
a$bc
[root@localhost tmp]# aa="a$bc"       //a+ $bc
[root@localhost tmp]# echo $aa
a
[root@localhost tmp]# aa="a$b"
[root@localhost tmp]# echo $aa
a2
[root@localhost tmp]# aa="a$b"c       //变量的累加
[root@localhost tmp]# echo $aa
a2c

变量是有范围的,先来看一个局部变量,仅仅在当前终端生效,我们首先打开两个终端。

[root@localhost tmp]#  echo $SSH_TTY
/dev/pts/0
[root@localhost tmp]# aming=1
[root@localhost tmp]# bash
[root@localhost tmp]# echo $aming

[root@localhost tmp]#
[root@localhost ~]# echo $SSH_TTY
/dev/pts/1
[root@localhost ~]# echo $aming

[root@localhost ~]# 

使用关键字export 可以把一个变量变为全局。

[root@localhost tmp]#  echo $SSH_TTY
/dev/pts/0
[root@localhost tmp]# export aming=linux
[root@localhost tmp]# echo $aming
linux
[root@localhost tmp]# bash
[root@localhost tmp]# echo $aming
linux
[root@localhost ~]# echo $SSH_TTY
/dev/pts/1
[root@localhost ~]# echo $aming

[root@localhost ~]# 

所以全局变量可以被所有的相同的pts下的子bash找到,而不同的pts是不能识别的。export是向下全局的,父bash是不会继承子shell的变量的。

[root@localhost tmp]# echo $aming
linux
[root@localhost tmp]# unset aming
[root@localhost tmp]# echo $aming

[root@localhost tmp]# 

unset可以取消赋值的变量。

8.9 环境变量配置文件

环境变量的配置文件有很多。

系统层次,是系统下的环境变量文件

/etc/profile 用户的环境变量,交互,登录才执行
/etc/bashrc 用户不用登录,执行shell就会生效

还有用户层次的,

~/.bashrc
~/.bash_profile
~/.bash_history
~/.bash_logout     //用户登出之后系统做的命令

当我们遇到一些需求,建议编辑家目录下的~/.bashrc 而系统层次的就不要动了。

这样的改变仅仅对于当前用户生效。

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
~     

使用命令source或者.都可以加载某一个bash文件。

可以看到,家目录下的默认.bashrc内,都会加载一次/etc/bashrc

最后介绍一个环境变量PS1。

[root@localhost tmp]# 

当我们登录一个shell的时候,可以看到有一串字符串,这个就是由PS1控制的。

[root@localhost tmp]# echo $PS1
[\u@\h \W]\$

u就是用户,h是主机名,W是最后一级目录,$是一个命令提示符,root下为#。

[root@localhost tmp]# PS1='[\u@\h \w]\$ '
[root@localhost /tmp]# cd /etc/sysconfig/network-scripts/
[root@localhost /etc/sysconfig/network-scripts]#

w为绝对路径。

PS1='[\[\033[01;32m\]\u@\h\[\033[00m\]: \[\033[01;36m\]\w\[\033[00m\]]\$ '
这是一个带颜色的显示。

PS2是内交互式的提示符。

比如我们进入python的交互,或者在命令行运行一段脚本,他的提示符就是PS2控制的。

[root@localhost: network-scripts]# echo $PS2
>
[root@localhost: network-scripts]# for i in `seq 1 10` 
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10

PS1介绍

扩展

【.bash_profile 与 .bashrc 的区别】
.bash_profile is executed for login shells, while .bashrc is executed for interactive non-login shells.


【login shell 与 non-login shell 的区别】
1、当你直接在机器login界面登陆、使用ssh登陆或者su切换用户登陆时,.bash_profile 会被调用来初始化shell环境
Note:.bash_profile文件默认调用.bashrc文件
.bash_profile中有如下内容
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi 
2、当你不登陆系统而使用ssh直接在远端执行命令,.bashrc 会被调用
3、当你已经登陆系统后,每打开一个新的Terminal时,.bashrc 都会被再次调用。

 

有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但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'

Linux中的PROMPT_COMMAND会记录下出现提示符前面的命令,利用这个特性可以实现记录所有用户的操作记录。
上面的和网上其它博客中的内容类似,但是仔细思考一下,还是存在几个问题

1. 首先root用户创建的HISTORY_FILE默认情况下只有root用户有rw权限,其它用户只有r的权限,这就导致其它用户的操作记录无法写入,需要将HISTORY_FILE赋予所有的读写权限

2. export PROMPT_COMMAND 如果将PROMPT_COMMAND导出到用户工作区,那么对于有经验的用户就可以做赋值操作 export PROMPT_COMMAND =“” ,简单的语法就会导致记录功能当前session端不可用,所以PROMPT_COMMAND必须设置成只读的属性,readonly PROMPT_COMMAND

 

转载于:https://my.oschina.net/u/3866688/blog/1838085

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值