shell的环境配置:

bash:

全局 

/etc/profile 

/etc/profile.d/*

/etc/bashrc

用户局部

~/.bash_profile

~/.bashrc


bash及其特性:

shell:外壳

GUI:Gnome、KDE、Xfce

CLI:sh、csh、ksh

sh、bsh borne

csh BSRG,bill joy

ksh 商业版本。GNU重开发ksh

bash GUN结合bsh和ksh重新开发 Borne Again SHell


程序和进程的关系:

进程可以被看做是程序的副本。进程是程序执行的实例。

在每个进程看来,当前主机上只存在内核和当前内核。是意识不到其他进程的存在。

进程可以名称一样,进程号不同即可。


linux允许1个账号登陆多次,每次登陆打开的不同的进程。


用户工作环境:

bash:

# 管理员

$ 普通用户


shell和子shell

在shell中可以新建多个子shell。退出子shell使用exit。

父shell和子shell是独立存在的,双方没有关联关系。


#pstree 显示进程树,可以看到shell和子shell的相关信息。


bash运行方式

交互式

/etc/profile --> /etc/profile.d/* -->~/.bash_profile -->~/.bashrc --> /etc/bashrc

非交互式

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*

profile类

1.设定环境变量

2.运行命令和脚本

bashrc类

1.设定本地变量

2.设定命令别名

重新读取配置文件:

#source FILE 

#. FILE

例如:修改~/.bash_profile来设定AGE为环境变量。

#nano ~/.bash_profile

exprot AGE=23

#echo $AGE

23

#sourec ~/.bash_profile

#bash

#echo $AGE

23


bash scripts

命令的集合

#bash SH_NAME.sh

#./SH_NAME.SH

#!/bin/bash shebang: magic number 让linux识别是什么程序。在script中一定写在首行。

scirpts中除了shebang以外使用#,代表注释。

例如:

#!/bin.bash

#date +%F


bash实例:

#!/bin/bash

DESTDIR='/tmp/test'

mkdir $DESTDIR

touch #DESTDIR/file-`date +%F-%H-%D-%M-%S`

cp -r /etc/profile.d $DESTDIR

unset DESTDIR


bash:

命令补全

搜索环境变量PATH所指定的每个路径下以我们给出的字符串(关键字KEY)开头的可执行文件,使用TAB键补全命令。如果多于1个,则按2下TAB键,将显示所有符合条件内容的列表。

例如:

#cl (按TAB或者2下TAB)

clear clock clockoff


内部命令:

shell自带

PAHT 命令的搜索路径

#echo $PATH 显示当前的路径。

#printenv 显示当前环境变量。


外部命令:

位于某路径下与命令名称相同的可执行程序

/bin,/sbin, /usr/bin, /usr/sbin等等。


#bash [OPTION] [COMMAND]显示执行命令的次数,所在路径,命令内容。hash表是查找速度最快的。

-r 移除所有的记录。

-d 指定命令名称为COMMAND


路径补全

根据给出的打头的路径进行查找,如果不唯一,连按2下TAB键。如果提示数量太多则会有提示。


命令历史

使用上下箭头显示输入过的命令。

执行的命令都会缓存在内存中,正常退出才能保存命令,保存地址在/USERNAME/.bash_history


#history [OPTION] 用于查看命令历史。

-c 删除所有记录

-w 将缓存中的记录保存至文件。会清除原有文件内容。

-a 追加缓存中的命令至文件。

-d NUM SUM指定偏移量,删除第NUM条开始后共计SUM条的记录。不指定SUM表示只删除第NUM条命令。



环境变量:

HISTFILE 内存中命令记录个数

#echo $HISTFILE

HISTFILESIZE 文件中命令记录个数。

#echo $HISTFILESIZE

HISTSIZE 命令历史缓冲区大小。默认是1000条。

#echo $HISTSIZE

HISTCONTROL=VALUE 控制命令如何保存。

#export HISTCONTROL=VALUE

ignorespace 忽略已以空白字符开头的的命令。

ignoredups 忽略重复命令,只记录第一次。

igonreboth 以上2个都忽略


命令历史的使用技巧:


#!NUM  执行并显示命令历史中的第NUM条命令,

例如:

#!441

date +%Y

2014


#!! 执行并显示上一条命令

例如:

#date +%y

2014

#!!

date +%Y

2014



#!-NUM 执行并显示倒数第NUM条命令。

例如:

#!-5

date +%Y

2014



#!KEYWORD 执行以KEYWORD开头的,命令历史中最近一次的命令。

例如:

#ls

#man ls

#cd ..

#!man

ls...


#COMMAND !$ 引用前一个命令的最后一个参数。

例如:

#cat /etc/initab

#nano !$


其他引用方法:

1.按ESC键松开后按.(点)

2.按住ALT键按.(点) 远程终端不支持。

命令行编辑

ctrl+a 定位到行首

ctrl+e 定位到行尾

ctrl+u 快速删除光标到行首

ctrl+k 快速删除光标到行尾

ctrl+← → 一次跳一个单词,仅限于图形窗口中打开的终端。

ctrl+l 清屏 等同于 #clear

ctrl+c 取消命令不再执行。


命令别名

可以给命令设定别名,方便日常操作。

在shell中定义的别名仅在当前shell生命周期中有效。


#alias [OPTION] ALIASNAME = COMMAND

例如

#alias cls = clear

#alias cdnet=`cd /etc/sysconfig/network-scripts/`



不加任何参数显示系统中定义的所有别名.

例如:

#alias

aliasls=‘ls --color=tty’

...

#unalias ALIASNAME 撤销别名

例如

#unalias cls


想使用命令本身使用\COMMAND,就能使用命令而不是别名了。


命令行展开

{a,b,……}:shell展开

例如:

#mkdir /tmp/{c,d}  生成/tmp/c和/tmp/d。

#mkdir /tmp/{x,y}_{m,n} 生成/tmp/x_m,/tmp/x_n,/tmp/y_m,/tmp/y_n。


命令替换

把命令中的某个子命令替换为其执行结果的过程。


#COMMAND1 $(COMMAND2)

#COMMAND1 `COMMAND2`


例如:

#echo "the current directory is $(pwd)."

#touch ./file-$(date +%F-%H-%M-%S).txt

#ls `cd /etc`


参数扩展

${PARAMETER#*WORD}

移除最短匹配前缀。将PARAMETER从左向右中最短匹配WORD的部分移除。

${PARAMETER##*WORD}

移除最长匹配前缀。将PARAMETER从左向右中最长匹配WORD的部分移除。

${PARAMETER%WORD*}

移除最短匹配后缀。将PARAMETER从右向左中最短匹配WORD的部分移除。

${PARAMETER%%WORD*}

移除最长匹配后缀。将PARAMETER从右向左中最长匹配WORD的部分移除。


例如:

#FILE=hello/usr/local/src

#echo ${FILE#*/}

usr/local/src

#echo ${FILE##*/}

scr

#echo ${FILE%/*}

hello/usr/local

#echo ${FILE%%/*}

hello


引用变量字符长度:

${#VARNAME}

例如:

#A="this is a test"

#echo ${#A}

14


文件名通配(Globbing)

*:任意长度的任意字符


?:任意单个字符


[]:匹配指定范围内的任意单个字符

例如:

[abc] abc中的一个

[a-z] 小写字母

[A-Z] 大写字母

[0-9] 数字

[a-zA-Z] 所有字母


特殊字符类(Character classes)

使用#man 7 glob即可获得常见字符类。

引用的时候要使用[[:CC:]]。


[:space:] 空白字符

[:punct:] 标点符号

[:lower:] 小写字母

[:upper:] 大写字母

[:alpha:] 大小写字母

[:digit:] 数字

[:alnum:] 数字和大小写字母


[^];脱字符,匹配指定范围以外的任意单个字符

例如:

[^0-9] 非数字


例如:

#ls [[:alpha:]*[[:space:]]*[[:alpha:]] 列出以字母开头,字母结尾,中间有空白字符的文件。

#ls [^[:alpha:]] 列出非字母开头的文件。

#ls [am]* 列出以a或m开头的文件。

#ls *[[:digit:]]* 列出文件名中包含数