博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽


认识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

   root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
.......
tansk:x:::tanshouke:/home/tansk:/bin/bash
mysql:x:::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
cd /opt/
mkdir mysql
cd
d my
cd /opt/mysql/
ll
  • Linux可以设置隐藏所敲的命令,提升信息安全功能
清空历史命令:history -c
隐藏命令设置步骤:

[root@t ~]# vim /etc/profile
在末尾输入:
HISTCONTROL=ignorespace

[root@t ~]# source /etc/profile

在敲命令前加上一个空格

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
? root systemd
? root kthreadd
? root ksoftirq
? root kworker/
? root migratio
? root rcu_bh
? root rcu_sche
  • 查看别名
[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 $? [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


转载需注明出处

认识shell的更多相关文章

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  5. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  6. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  7. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  8. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  9. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  10. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

随机推荐

  1. 吴裕雄--天生自然TensorFlow2教程:数学运算

    import tensorflow as tf b = tf.fill([2, 2], 2.) a = tf.ones([2, 2]) a+b a-b a*b a/b b // a b % a tf. ...

  2. 寒假day11

    毕设数据抽取部分还有一点问题,正在修改中

  3. [Security] Web Security Essentials

    In this course, we'll learn how to exploit and then mitigate several common Web Security Vulnerabili ...

  4. 跟踪LinkedList源码,通过分析双向链表实现原理,自定义一个双向链表

    1.LinkedList实现的基本原理 LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first  .last,因其有头尾两个节点,所以从头或从尾操作数据都非常容易快捷.Lin ...

  5. MySQL--通过.frm和.ibd对mysql数据恢复

    转载:http://bbs.csdn.net/topics/392114182 例如说 现在要恢复user表1.先建立和之前user表一样的表结构.就是执行create table user .... ...

  6. vscode显示当前文件完整路径信息

    Code->Preferences->Settings 搜索window.title 原本是activeEditorShort,修改 activeEditorShort => act ...

  7. 深入浅出 java.String

    深入浅出 java.String Java 处理字符串常用的一些方法 Java定义一个字符串 直接定字符串 直接定义字符串表示直接使用""来表示字符串中的内容 String str ...

  8. SJTU T4143 推箱子

    问题描述 推箱子是一款经典的小游戏.游戏要求玩家将若干个箱子推到指定的位置,并以箱子移动次数最少作为目标. 现在,我们只需要考虑一个简化的版本--只有一个箱子.对于一张给定的地图,你需要判断是否可以将 ...

  9. Nginx安全优化

    一.隐藏版本号 http { server_tokens off; } 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然最重要的是及时升级修复漏洞. ...

  10. javaweb学习——会话技术(一)

    会话: 1.什么是会话:从打开一个浏览器,访问页面,到最终关闭浏览器的一个过程,就是一次会话. 2.会话的特点:包含多个请求,一次完整的会话是只针对一个用户. 3.会话机制:web中常用的技术,用来跟 ...