认识shell

若如初见. 提交于 2020-01-14 17:56:24

认识shell


 

一、由来

第一个流行的 shell 是由
Steven Bourne 发展出来的,为了纪念他所以就称为 Bourne shell ,或直接简称为 sh !而后
来另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计依附于 BSD 版的 Unix 系统中的
shell ,这个 shell 的语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh !由于在学术
界 Sun 主机势力相当的庞大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一个很重
要而且流传很广的 shell 之一 。
 

二、现状

  • /bin/sh (已经被 /bin/bash 所取代)
  • /bin/bash (就是 Linux 默认的 shell)
  • /bin/tcsh (整合 C Shell ,提供更多的功能)
  • /bin/csh (已经被 /bin/tcsh 所取代) 

 

三、默认shell

  • 当我们登录系统会获取默认的shell来进行工作,默认的shell记录在/etc/passwd里
[root@test ~]# vim /etc/passwd
  
  1 root:x:0:0:root:/root:/bin/bash
  2 bin:x:1:1:bin:/bin:/sbin/nologin
  3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.......
 20 tansk:x:1000:1000:tanshouke:/home/tansk:/bin/bash
 21 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

 

 四、shell功能

shell是用于人与计算机(kenel)进行交互的工具

4.1.命令编辑能力(history)

  • history默认可以记录1000个命令。命令记录的位置在.bash_history里面。
不过,需要留意的是,~/.bash_history 记录的是前一次登陆以前所执行过的指令, 而至于这一次登陆所执行的指令都被暂存在内存中,当你成功的登出系统后,该指令记忆才会记录到 .bash_history 当中!
[root@test ~]# cat .bash_history -n 
     1  cd /opt/
     2  mkdir mysql
     3  cd
     4  d my
     5  cd /opt/mysql/
     6  ll
  • Linux可以设置隐藏所敲的命令,提升信息安全功能
清空历史命令:history -c
隐藏命令设置步骤:
1、
[root@t ~]# vim /etc/profile
在末尾输入:
HISTCONTROL=ignorespace
2、
[root@t ~]# source /etc/profile
3、
在敲命令前加上一个空格

 4.2.命令别名设置(alias、unalias)

  • 自定义命令qstat,此命令将执行/bin/ps -Ao pid,tt,user,fname,rsz
[root@test ~]# echo "alias qstat='/bin/ps -Ao pid,tt,user,fname,rsz'">>/etc/bashrc
[root@test ~]# bash
[root@test ~]# qstat 
   PID TT       USER     COMMAND    RSZ
     1 ?        root     systemd   3964
     2 ?        root     kthreadd     0
     3 ?        root     ksoftirq     0
     5 ?        root     kworker/     0
     7 ?        root     migratio     0
     8 ?        root     rcu_bh       0
     9 ?        root     rcu_sche     0
  • 查看别名
[root@test ~]# alias 
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 qstat='/bin/ps -Ao pid,tt,user,fname,rsz'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@test ~]# 
  • 程序化脚本(sell script)
[root@test bin]# vim hello.sh 
#!/bin/bash 
export PATH 
echo -e "Hello World! \a \n" 
exit 100                         #自定义输出100,程序正常执行,默认输出为0
[root@test bin]# bash hello.sh 
Hello World!  

[root@test bin]#
[root@test bin]# ./hello.sh 
Hello World!

[root@test bin]# echo $? 
100
[root@test bin]#

 

五、检查内置命令

  • 5.1.type
[root@test bin]# type qstat
qstat is aliased to `/bin/ps -Ao pid,tt,user,fname,rsz'
[root@test bin]# type ls
ls is aliased to `ls --color=auto'
[root@test bin]# type cd
cd is a shell builtin  #表示内置命令
[root@test bin]#
选项与参数: :不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内置指令 -t :当加入 -t 参数时,type 会将 name 以下面这些字眼显示出他的意义:     file :表示为外部指令;     alias :表示该指令为命令别名所设置的名称;      builtin :表示该指令为 bash 内置的指令功能; -p :如果后面接的 name 为外部指令时,才会显示完整文件名; -a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias
[root@test bin]# type -t qstat
alias
[root@test bin]# type -t cd
builtin
[root@test bin]# 

 

  • 5.2.witch
[root@test bin]# which qstat 
alias qstat='/bin/ps -Ao pid,tt,user,fname,rsz'
        /bin/ps
[root@test bin]# which cd    
/usr/bin/cd
[root@test bin]# which yum
/usr/bin/yum
[root@test bin]# which type
/usr/bin/which: no type in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@test bin]# which passwd 
/usr/bin/passwd
[root@test bin]# 

 

六、shell变量

  • 6.1.变量的取用:echo
[root@test ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@test ~]# 
  • 6.2.特殊变量

参数处理

说明

$#

传递到脚本的参数个数

$*

以一个单字符串显示所有向脚本传递的参数。

如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。

如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$-

显示Shell使用的当前选项,与set命令功能相同。

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

  • 6.3.自定义变量:unset
[root@test ~]# echo $test       

[root@test ~]# test="^_^"  #“=”的两边不能有空格
[root@test ~]# echo $test
^_^
[root@test ~]# echo $test
^_^
[root@test ~]# unset test
[root@test ~]# echo $test

[root@test ~]# 

 

七、环境变量

  • 7.1.常用指令
[root@test ~]# env #列出所有的环境变量
[root@test ~]# set #观察所有环境变量与自定变量
[root@test ~]# export  #列出所有的环境变量三者区别:
[root@test ~]# test="^_^"
[root@test ~]# env|grep test
HOSTNAME=test
[root@test ~]# export |grep test
declare -x HOSTNAME="test"
[root@test ~]# set | grep test
HOSTNAME=test
test='^_^'
        -h | --help | -t | --testopia)
        COMPREPLY=($( compgen -W '--help --checkall --testopia --treeinfo'             -- "$cur" ));
[root@test ~]# 

 

  • 7.2.PS1

PS1就是我们的命令提示符

[root@test ~]# echo $PS1
[\u@\h \W]\$
[root@test ~]#

含义:

  1. \d :可显示出“星期 月 日”的日期格式,如:"Mon Feb 2"
  2. \H :完整的主机名称。举例来说,鸟哥的练习机为“study.centos.vbird”
  3. \h :仅取主机名称在第一个小数点之前的名字,如test.student主机则为“test”后面省略
  4. \t :显示时间,为 24 小时格式的“HH:MM:SS”
  5. \T :显示时间,为 12 小时格式的“HH:MM:SS”
  6. \A :显示时间,为 24 小时格式的“HH:MM”
  7. \@ :显示时间,为 12 小时格式的“am/pm”样式
  8. \u :目前使用者的帐号名称,如“root”;
  9. \v :BASH 的版本信息,如鸟哥的测试主机版本为 4.2.46(1)-release,仅取“4.2”显示
  10. \w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代;
  11. \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
  12. # :下达的第几个指令。
  13. $ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~

 

八、系统欢迎词

[root@test ~]# cat /etc/issue  (#可自行更改,设置个性化欢迎词)
\S
Kernel \r on an \m

[root@test ~]#

除了 /etc/issue 之外还有个 /etc/issue.net 呢!这是啥?这个是提供给 telnet
这个远端登陆程序用的。 当我们使用 telnet 连接到主机时,主机的登陆画面就会显示
/etc/issue.net 而不是 /etc/issue

如果想要登陆者在登录的时候都知道讯息,需要在/etc/motd里面添加,例如:

[root@test ~]# cat /etc/motd 
Hello everyone,welcom to learn !
^_^
[root@test ~]# 

综合上述:登录欢迎词是/etc/issue+/etc/motd的合计

 


 

九、bash的环境配置文件

  • /etc/profile:这是系统整体的设置,你最好不要修改这个文件;
  • ~/.bash_profile ~/.bash_login ~/.profile:属于使用者个人设置,你要改自己的数

9.1./etc/profile (login shell 才会读)

这个文件设置的变量主要有:

  • PATH:会依据 UID 决定 PATH 变量要不要含有 sbin 的系统指令目录;
  • MAIL:依据帐号设置好使用者的 mailbox /var/spool/mail/帐号名;
  • USER:根据使用者的帐号设置此一变量内容;
  • HOSTNAME:依据主机的 hostname 指令决定此一变量内容;
  • HISTSIZE:历史命令记录笔数。CentOS 7.x 设置为 1000
  • umask:包括 root 默认为 022 而一般用户为 002

/etc/profile 可不止会做这些事而已,他还会去调用外部的设置数据喔!在 CentOS 7.x 默认的

情况下,下面这些数据会依序的被调用进来:

9.1.1./etc/profile.d/*.sh

目录下面的文件规范了 bash 操作接口的颜色、 语系、ll ls 指令的命令别名、vi 的命令别

名、which 的命令别名等等。如果你需要帮所有使用者设置一些共享的命令别名时, 可以在

这个目录下面自行创建扩展名为 .sh 的文件,并将所需要的数据写入即可喔!

9.1.2./etc/locale.conf

这个文件是由 /etc/profile.d/lang.sh 调用进来的!这也是我们决定 bash 默认使用何种语系的

重要配置文件! 文件里最重要的就是 LANG/LC_ALL 这些个变量的设置啦!

9.1.3./usr/share/bash-completion/completions/*

除了命令补齐、文件名补齐之外,还可以进行指令的选项/

参数补齐功能!那就是从这个目录里面找到相对应的指令来处理的! 其实这个目录下面的内

容是由 /etc/profile.d/bash_completion.sh 这个文件载入的啦! 

9.1.4.~/.bash_profile (login shell 才会读)

bash 在读完了整体环境设置的 /etc/profile 并借此调用其他配置文件后,接下来则是会读取使

用者的个人配置文件 login shell bash 环境中,所读取的个人偏好配置文件其实主要

有三个,依序分别是:

1. ~/.bash_profile

2. ~/.bash_login

3. ~/.profile

其实 bash login shell 设置只会读取上面三个文件的其中一个 而读取的顺序则是依照上

面的顺序。也就是说,如果 ~/.bash_profile 存在,那么其他两个文件不论有无存在,都不会

被读取。 如果 ~/.bash_profile 不存在才会去读取 ~/.bash_login,而前两者都不存在才会读取

~/.profile 的意思。

 

总结:反正只要记得,bash 的 login shell 情况下所读取的整体环境配置文件其实只有

/etc/profile,但是 /etc/profile 还会调用出其他的配置文件,所以让 bash 操作接口变的

非常的友善!最后读取 使用者的个人配置文件:~/.bash_profile

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!