热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《鸟哥的Linux私房菜》学习笔记(2)——Bash特

一、shell的基本概念:                               shell 



一、shell的基本概念:                              





shell 


意思


是外壳,它是


离用户最近的程序。shell提供用户操作系统的接口,


我们通过

shell

将输入的命令与

内核

通信,使内核可以控制

硬件

来正确无误的工作。广义上的shell包含两类GUI和CLI。


  GUI:Gnome,KDE,Xface


  CLI:sh,csh,ksh,bash,tcsh,zsh(合法的shell要写入/etc/shells这个文件,系统某些服务在运行过程中,可能会去检查用户能够使用的shell)


  当用户登陆的时候,系统会分配一个shell来进行工作。默认会取得的shell记录在/etc/passwd文件中,可以看到hao这个用户默认取得的是bash。




[hao@hao ~]$



cat

/etc/

passwd



root:x:


0

:

0

:root:/root:/bin/

bash
bin:x:


1

:

1

:bin:/bin:/sbin/

nologin
...



hao:x:


500

:

500

:haohao:/home/hao:/bin/bash


  当有多个用户登陆的时候,会有多个进程,进程之间彼此互不相干,因为对于每个进程来说,它只认为当前主机上只有自己和内核存在。linux允许一个用户账号登陆多次 。


  进程是程序的副本,进程是程序执行的实例,是有生命周期的,由内核进行管理。


  用户工作环境,多个用户尽管使用的都是shell程序,但是各个用户的工作环境设定却可以各不相同,只不过默认情况下除了管理员,都是一样的。


  shell,子shell。可以在一个shell中在启动一个子shell。父shell和子shell都不能意识到彼此正在运行。很多时候对父shell的设定对子shell无效,子shell的设定对父shell也无效。下面的通过pstree命令可以看出该关系,如果退出到上一层bash,可以用exit命令。退到最上一层时候,会退出当前登陆。




[hao@hao ~





]$


bash


[hao@hao





~





]$


pstree
init

-+-NetworkManager-+-

dhclient


| `-

{NetworkManager}


|-

abrtd


|-

acpid
...



|-sshd---sshd---sshd---bash---bash---pstree


|-

trashapplet
...




[hao@hao





~





]$


bash


[hao@hao





~





]$


pstree
init

-+-NetworkManager-+-

dhclient


| `-

{NetworkManager}


|-

abrtd


|-

acpid
...


|-sshd---sshd---sshd---bash---bash---bash---pstree


|-

trashapplet
...



  当然,bash下也可以嵌套运行csh,ksh




[hao@hao ~





]$


pstree
init

-+-NetworkManager-+-

dhclient


| `-

{NetworkManager}


|-

abrtd


|-

acpid


|-

atd
...



|-sshd---sshd---sshd---bash---pstree


|-udevd---

2

*

[udevd]
`

-

wpa_supplicant


[hao@hao





~





]$


csh


[hao@hao





~





]$


pstree
init

-+-NetworkManager-+-

dhclient


| `-

{NetworkManager}


|-

abrtd


|-

acpid


|-

atd
...



|-sshd---sshd---sshd---bash---csh---pstree


|-udevd---

2

*

[udevd]
`

-wpa_supplicant



二、为什么学习shell                                





  • 一法通,万法通。虽然X Window将所有用到的软件都集成在一起,但它并非是一个完整的套件,所以某些时候当升级或者使用其他套件管理模块时,会遇到一些麻烦。




  • 远程管理:命令行界面比较快。Linux的管理经常需要远程联机,联机时命令行界面的传输速度比较快,而且较不容易出现断线或者信息外流。




三、shell的特性                                 :





1、命令历史、命令补全




  默认的命令记忆功能可以达到1000(环境变量HISTSIZE保存该数值)个,前一次登陆以前所执行过的命令历史记录在~/.bash_history,而本次登陆所执行的命令都被暂存在临时内存中,当注销后,该命令记忆才会被记录到~/.bash_history当中。


  查看命令历史(包含本次执行的history命令):history


    -c(clear):清空命令历史


    -d offset [n]:删除第offset条命令,history -d 500 10从第五百条命令往后删10条


    -w(wriet):将当前缓冲区中历史命令写入到历史文件中去。


    n(number):列出最近的n条命令行。


  history历史命令的使用技巧:


  !n:执行命令历史的第number命令


  !-n:执行命令历史记录的倒数第n条命令。


  !!:执行上一条命令。


  !vi:执行命令历史中最近一个以vi开头的命令。


[hao@hao ~

]$ history


1

ll etc/


...


141


ls

-

a


142

LANG=

en


143


ls

-

a


144

ll ~/

.bash_history


145


cat

~/

.bash_history


146


man


history


147

history -

w


148


history


149


cat

~/

.bash_history


150


history
[hao@hao

~]$ !

141


ls

-

a
. .bash_history .cache .gconf .gnote .gvfs .mozilla .recently

-used.xbel .xsession-errors.old ?????? ??????


.. .bash_logout .config .gconfd .gnupg .history .nautilus .


ssh

?????? ??????


.ICEauthority .bash_profile .dbus .gnome2 .gstreamer

-

0.10

.imsettings.log .pulse .viminfo ????????? ??????


.abrt .bashrc .esd_auth .gnome2_private .gtk

-bookmarks .local .pulse-COOKIE .xsession-errors ?????? ??????


  命令补全:命令补全是在PATH环境变量下搜索命令。tab键自动补全(唯一),连敲两下tab键可以搜索所有已所敲字符为开头的命令。 






2、管道、重定向





3、命令别名





root@hao:~





#


alias
alias


egrep

=

'


egrep --color=auto


'



alias


fgrep

=

'


fgrep --color=auto


'



alias


grep

=

'


grep --color=auto


'



alias l

=

'


ls -CF


'



alias la

=

'


ls -A


'



alias ll

=

'


ls -alF


'



alias


ls

=

'


ls --color=auto


'





alias CMDALIAS='COMMAND [options] [arguments]'




root@hao:~#


alias cls=

'


clear


'



  在shell中定义的别名只在当前shell的生命周期中有效,别名的有效范围为当前shell进程,即使相同的用户在另一个shell中。若想让该别名永久有效,只需要将该别名写入shell应用程序的配置文件。


  撤销命令别名:unalias CMDALIAS;


  如果命令别名与原命令是一个名字,但是命令别名加入了一些选项。若此时想使用原命令,则需要使用\COMMAND。




4、命令替换




  把命令中某个子命令替换为其执行结果的过程叫做命令替换,如下面把子命令pwd的执行结果替换为命令echo的执行结果。


  格式$(command)或者`command`




hao@hao:~$



pwd

/home/

hao


hao@hao:





~$



echo


"


This current /home/hao


"



This current

/home/

hao


hao@hao:





~$


cd /etc/sysctl.d/


hao@hao:/etc/sysctl.d$



echo


"


This current directory is $(pwd).


"



This current directory is

/etc/

sysctl.d.


hao@hao:





/etc/





sysctl.d$


cd


hao@hao:





~$



echo


"


This current directory is $(pwd).


"



This current directory is

/home/hao.


  在当前目录下(./)创建一个以当前时间命名的txt文件。




hao@hao:~$



touch

./

file

-$(

date

+%F-%H-%M-%

S).txt


hao@hao:





~$



ls



examples.desktop


file

-

2014

-

08

-

01

-

16

-

52

-

15

.txt ?????? ????????? ?????? ?????? ?????? ?????? ?????? ??????


hao@hao:~$




 补充,bash支持的三种引号:




  • 单引号'':强引用,不完成变量替换




  • 双引号"":弱引用,可以实现变量替换




  • 反引号``:命令替换




5、命令行编辑



  光标跳转:


    ctrl+a跳到行首


    ctrl+e跳到行尾


    ctrl+u删除光标至命令行首的内容


    ctrl+k删除光标至命令行尾的内容


    ctrl+->向右跳转一个单词


    ctrl+<-向左跳转一个单词


    ctrl+l清屏



6、命令行展开




7、文件名通配,globbing





 *:

任意长度的任意字符。/root/test目录下以a开始的任意文件





root@hao:~/test#


tree /

root

/

root

|--

m

| `--

n

| `--

t
`

--

test

|--

a

|--

a123

|--

ab123

|--

abc

|--

x12

|--

xyz
`

--

xyz123


4

directories,

7


files


root@hao:





~/test#



ls

a*


a a123 ab123 abc





  ?:

匹配任意单个字符。文件名第二个字符是y的文件





root@hao:~/test#



ls

?y*


xyz xyz123





  []:

匹配指定范围内的任意单个字符。


以字母开头,数字结尾的文件。还有一些特殊字符,可以使用man 7 glob查看,常用的如下。










  •   [[:space:]],




    空白字符














  •   [[:punct:]],




    标点符号














  •   [[:lower:]],




    小写字符














  •   [[:upper:]],




    大写字母














  •   [[:alpha:]],




    大小写字母














  •   [[:diget:]],




    数字














  •   [[:alnum:]],字母和数字









,root@hao:~/test#



ls

[a-zA-Z]*[

0

-

9


]
a123 ab123 x12 xyz123






  以字母开头和结尾的文件名中间包含空格的文件






root@hao:~/test#

touch

'

a b

'


root@hao:~/test#



ls

a b a123 ab123 abc x12 xyz xyz123



root@hao:~/test#

ls [[:alpha:]]*[[:space:]]*

[[:alpha:]] a
















 [^]:

匹配指定范围之外的任意单个字符。以非a开头的所有文件







root@hao:~/test#



ls

[^a]*


x12 xyz xyz123




8、变量




9、编程



《鸟哥的Linux私房菜》学习笔记(2)——Bash特性




推荐阅读
author-avatar
bl乄ue光耀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有