Linux基础--Bash的基本特性


1. 命令别名

定义clear别名为cls
[root@localhost ~]# alias cls=clear
打印当前已生效别名
[root@localhost ~]# alias 
alias cls='clear'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
取消别名定义cls
[root@localhost ~]# unalias cls
执行命令本身而不是别名
[root@localhost ~]# \ls
anaconda-ks.cfg  bd_logo1.png

2. 命令历史

查看所有有记录的历史命令
[root@localhost ~]# history
查看10条最近记录的历史命令
[root@localhost ~]# history 10
执行history列表中第10号命令
[root@localhost ~]# !10
执行history列表中最近一条以echo开头的命令
[root@localhost ~]# !echo
删除history列表中第10号命令
[root@localhost ~]# history -d 10
将当前缓冲的历史行追加到历史文件中
[root@localhost ~]# history -a
清空history列表
[root@localhost ~]# history -c
从历史文件中读取所有未被读取的行
[root@localhost ~]# history -n
读取历史文件并将内容追加到历史列表中
[root@localhost ~]# history -r

命令历史相关的环境变量

[root@localhost ~]# echo $HISTSIZE
1000
[root@localhost ~]# echo $HISTFILESIZE
1000
[root@localhost ~]# echo $HISTFILE
/root/.bash_history
[root@localhost ~]# echo $HISTCMD
733
[root@localhost ~]# echo $HISTCONTROL
ignoredups

$HISTCONTROL有三种取值分别表示

ignoredups:忽略重复的命令;重复是指连续且相同的命令;
ignorespace:以空白字符开头的命令不记入历史;
ignoreboth:上述两者同时生效;


3. 快捷键

Ctrl+a:跳至命令行首;
Ctrl+e:跳至命令行尾;
Ctrl+k:删除光标所在处至尾部的内容;
Ctrl+u:删除行首至光标所在处的内容;
Ctrl+w:删除行尾一个单词(非英语单词,而是以空格分隔开的一段连续字符串);


4. 自动补全


5. 命令行展开

[root@localhost ~]# mkdir -pv /tmp/rootfs/{bin,sbin,lib,lib64,tmp,usr/{,local}/{bin,sbin},var/{log/httpd,spool}}


6. 命令执行状态与执行结果

[root@localhost ~]# echo $(date +%H:%M:%S)
22:13:06
[root@localhost ~]# echo `date +%H:%M:%S`
22:13:24
[root@localhost ~]# echo $?
0


7. 强引用与弱引用

[root@localhost ~]# echo '$SHELL'
$SHELL
[root@localhost ~]# echo "$SHELL"
/bin/bash


8. 文件名通配

[root@localhost ~]# ls -l /etc/[ekm]*[[:digit:]]*.conf
-rw-r--r--. 1 root root 112 Mar  6  2015 /etc/e2fsck.conf
-rw-r--r--. 1 root root 495 Mar  6  2015 /etc/krb5.conf
-rw-r--r--. 1 root root 936 Mar  6  2015 /etc/mke2fs.conf

常用的通配符有以下几个

*:匹配任意长度的任意字符;
?:匹配任意单个字符;
[ ]:匹配指定集合内的任意单个字符;
[^ ]:匹配指定集合外的任意单个字符;

更复杂的用法参照

[root@localhost tmp]# man 7 glob

注意:glob与正则表达式的区别。


9. 变量

bash是弱类型编程语言,bash中变量统统默认为字符型数据,且无需事先声明而直接使用。

bash变量有三种类型

  • 本地变量, 作用域为当前shell进程,不包含其子进程;

  • 环境变量, 作用域为当前shell进程及其子进程;

  • 局部变量, 作用域为定义此变量的函数。


环境变量

Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。


查看当前用户登录bash的环境变量

[root@localhost ~]# env 
[root@localhost ~]# printenv 
或者
[root@localhost ~]# export
[root@localhost ~]# declare -x


只读变量

[root@localhost ~]# declare -r myvar="how are you?"
[root@localhost ~]# readonly myvar="how are you?"


查看当前bash进程中的只读变量

[root@localhost ~]# readonly 
declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="2814"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
declare -r myvar="how are you?"

只读变量不支持重新赋值,也不支持unset操作, 只能退出当前bash进程,该变量才会消失。


10. 重定向与管道

标准输入(stdin)    文件描述符为0
标准输出(stdout)    文件描述符为1
标准错误输出(stderr)    文件描述符为2


标准输出重定向

[root@localhost tmp]# echo "how are you?" > demo    #覆盖
[root@localhost tmp]# echo "how old are you?" >> demo    #追加


标准错误输出重定向

[root@localhost tmp]# echoooo "how are you?" 2> demo    #覆盖
[root@localhost tmp]# echoooo "how old are you?" 2>> demo    #追加


合并标准输出与标准错误输出

[root@localhost tmp]# echo "how are you?" &> demo    #覆盖
[root@localhost tmp]# echo "how old are you?" &>> demo    #追加
或者
[root@localhost tmp]# echo "how are you?" > demo 2>&1   #覆盖
[root@localhost tmp]# echo "how old are you?" &>> demo 2>&1    #追加


标准输入重定向

[root@localhost ~]# tr [a-z] [A-Z] < /etc/issue
\S
KERNEL \R ON AN \M
MAGE EDUCATION LEARNING SERVICES
HTTP://WWW.MAGEDU.COM


Here Document

cat << EOF > /tmp/issue.doc
\S
Kernel \r on an \m
Mage Education Learning Services
http://www.magedu.com
EOF


管道

[root@localhost ~]# cat /etc/issue | tee /tmp/$(date +%Y%m%d%H%M%S)


11. 环境配置

bash的环境配置文件根据功能来分有三类:

  • profile类:为shell进程实现初始化配置。主要是运行初始化命令和脚本,并设置环境变量。

  • bashrc类:为shell进程实现启动配置。主要是定义umask和命令别名,并设置本地变量。

  • logout类:为shell进程提供终止进程前的清理工作,主要是清理变量和临时文件。

logout类的环境配置文件一般不会去做自定义修改,因此后面不讨论它。


bash的环境配置文件根据作用范围来分有两类:

  • 全局:对所有用户都生效。/etc/profile, /etc/profile.d/*.sh, /etc/bashrc

  • 用户:仅对某个用户生效。~/.bash_profile, ~/.bash_rc


登录式shell与非登录式shell启动时加载的配置文件数量和顺序不同。

  • 登录式shell:账户登录的shell。如通过终端登录的shell,“su -l USERNAME”。

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

  • 非登录式shell:没有通过账户登录的shell。如通过桌面环境打开的命令行接口,“su USERNAME”

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


注意:

  • 全局环境配置文件只有管理员有权限修改。

  • 只有加载了的配置文件中的环境配置才会生效。

  • 当不同的配置文件中设置了相同的变量但值不同,后加载的会覆盖先前的配置。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章