8.6 管道符和作业控制
• 管道符 | 把前面命令输出的结果给后面命令运行
[root@localhost ~]# cat /etc/passwd |grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# cat /etc/passwd |wc -l
22
• ctrl z 暂停一个任务
[root@localhost ~]# sleep 100
^Z
[1]+ 已停止 sleep 100
• jobs查看后台的任务
[root@localhost ~]# jobs
[1]- 已停止 sleep 100
[2]+ 已停止 sleep 300
bg fg不加任务id默认调用有+标志的任务
• bg[id]把任务调到后台
[root@localhost ~]# bg 2
[2] sleep 300 &
[root@localhost ~]# jobs
[1] 已停止 sleep 100
[2] 运行中 sleep 300 &
[3]- 已停止 sleep 100
[4]+ 已停止 sleep 10
bg后的任务在后台处于运行状态,命令后面&表示后台运行
• fg[id]把任务调到前台
[root@localhost ~]# jobs
[1]- 已停止 vmstat 1
[2]+ 已停止 vim .bash_history
[root@localhost ~]# fg 1
vmstat 1
2 0 0 1617656 764 156500 0 0 4648 126 1398 2346 0 0 100 0 0
0 0 0 1617656 764 156500 0 0 0 0 31 57 0 0 100 0 0
0 0 0 1617656 764 156500 0 0 0 0 29 52 0 0 100 0 0
• 命令后面加&直接丢到后台
[root@localhost ~]# sleep 100 &
[3] 2510
[root@localhost ~]# jobs
[1]+ 已停止 vmstat 1
[2]- 已停止 vim .bash_history
[3] 运行中 sleep 100 &
8.7/8.8 shell变量
• PATH,HOME,PWD,LOGNAME
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/tmp
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $LOGNAME
root
注:系统内置变量用大写英文字母
• env命令
env命令用于显示系统中已存在的环境变量
[root@localhost ~]# env
XDG_SESSION_ID=10
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.20.3.27 50637 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/tmp
PWD=/root
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=172.20.3.27 50637 172.20.5.89 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
• set命令多了很多变量,并且包括用户自定义的变量
注:set可以查看用户自定义的变量;
• 自定义变量a=1
a=1
b=2
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# set |grep 'a=1' ; set |grep 'b=2'
a=1
b=2
[root@localhost ~]# echo $a
1
[root@localhost ~]# echo $b
2
• 变量名规则:字母、数字下划线,首位不能为数字
• 变量值有特殊符号时需要用单引号括起来,(单引号有脱义的效果)
a='1 2 3 '
b='a$bc'
[root@localhost ~]# c=$a$b
[root@localhost ~]# echo $c
1 2 3 2
[root@localhost ~]# d='$a$b'
[root@localhost ~]# echo $d
$a$b
• 变量的累加
c=a"$b"c 变量c等于a变量b的值c
[root@localhost ~]# b=1
[root@localhost ~]# c=a"$b"c
[root@localhost ~]# echo $c
a1c
• 全局变量export b=2
w命令查看负载,可以看到有哪些终端登录了linux。
[root@localhost ~]# w
14:34:56 up 4:18, 2 users, load average: 0.00, 0.01, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 10:16 2:05m 0.05s 0.05s -bash
root pts/0 172.20.3.27 12:29 0.00s 0.05s 0.01s w 此行表示当前终端
SSH_TTY 当前登录终端的变量
[root@localhost ~]# echo $SSH_TTY
/dev/pts/0
bash 在当前终端打开一个新的bash环境;exit退出bash;
pstree命令以树状图显示进程间的关系;
[root@localhost ~]# bash
[root@localhost ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─3*[{NetworkManager}]
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─dhclient
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
自定义的变量只能在当前终端bash下用,重新打开个bash就认不到了:
[root@localhost ~]# a=1
[root@localhost ~]# echo $a
1
[root@localhost ~]# bash
[root@localhost ~]# echo $a
[root@localhost ~]#
export全局通告后的变量可以在当前bash的子bash中生效;另外一个终端不生效,在新的bash中export 的
变量,在终端bash不生效
[root@localhost ~]# export a=gavin
[root@localhost ~]# bash
[root@localhost ~]# echo $a
gavin
[root@localhost ~]# export b=123
[root@localhost ~]# echo $b
123
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $b
[root@localhost ~]#
• unset 变量
取消定义的变量;
[root@localhost ~]# echo $a
gavin
[root@localhost ~]# unset a
[root@localhost ~]# echo $a
[root@localhost ~]#
8.9 环境变量配置文件
环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell。对于UNIX,可能是CShelll。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。下面通过几个实例来说明。
一.系统级:
•/etc/profile 用户环境变量,交互,登录才执行
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目
录的配置文件中搜集shell的设置.
注:在这里我们设定是为所有用户可使用的全局变量。
• /etc/bashrc 用户不用登录,执行shell就生效
为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取
二.用户级(这些文件处于家目录下):
• ~/.bashrc
该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取,例如你可以将
用户自定义的alias或者自定义的变量写到这个文件中。
• ~/.bash_profile
定义了用户的个人化路径与环境变量的文件名称。每个用户都可以使用该文件输入专用于自己使用的shell信息
当用户登录时该文件仅仅执行一次。
• ~/.bash_history
记录命令历史用的,只在用户退出当前终端或使用history -w时写入命令历史。
• ~/.bash_logout
当退出shell时会执行该文件,可以把一些清理掉工作放到这个文件中。
• PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
设置成带颜色和完整路径的显示
PS1是我们登录到linux后前面的那串字符了,例如chentos7 root用户默认的PS1就是[root@localhost ~]#。
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
\u就是用户,\h主机名 ,\W 则是当前目录,\$ 就是那个“#"了,如果普通用户则显示为"$"
当bash期待输入更多的信息以完成命令时将显示第二级提示符。
比如:你输入cp filename1 \,回车,此时就出现第二级提示符。\是续行的意思。
默认的第二级提示符是“>;”。
如果要改变第二级提示符,可以通过在.bash_profile文件里设置PS2变量来实现。
[root@localhost ~]# echo $PS2
>
[root@localhost ~]#
source命令:
当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录;这时就想到用source命令,如:source /etc/profile . /etc/profile
source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令。
功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句
source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
用法:
source filename 或 . filename
source命令(从 C Shell 而来)是bash shell的内置命令;点命令(.),就是个点符号(从Bourne Shell而来)是source的另一名称。
bash_profile和bashrc区别
【.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 都会被再次调用。
测试准备工作
hclient2主机hadoop用户家目录下执行
[hadoop@hclient2 ~]$ echo "invoke hclient2:~/.bashrc">>.bashrc
[hadoop@hclient2 ~]$ echo "invoke hclient2:~/.bash_profile">>.bash_profile
Login Shell
1、窗口登陆
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel 2.6.32-279.el6.x86_64 on an x86_64
hclient2 login: hadoop
Password:
Last login: Mon Feb 25 23:03:45 on tty1
invoke hclient2:~/.bashrc
invoke hclient2:~/.bash_profile
[hadoop@hclient2 ~]$
2、SSH 登陆
[hadoop@hserver ~]$ ssh hclient2
Last login: Mon Feb 25 22:42:19 2013 from hserver
invoke hclient2:~/.bashrc
invoke hclient2:~/.bash_profile
[hadoop@hclient2 ~]$
3、su 登陆
[root@hclient2 ~]# su - hadoop
invoke hclient2:~/.bashrc
invoke hclient2:~/.bash_profile
Non-login Shell:
Note: ssh ...[user@] hostname [command]
If command is specified, it is executed on the remote host instead of a login shell.
[hadoop@hserver ~]$ ssh hclient2 hostname
invoke hclient2:~/.bashrc
hclient2
【故】若要配置环境变量之类,最保险是写在 .bashrc 文件中。因为不管是登陆还是不登陆,该文件总会被调用!