📄 认识bash shell.txt
字号:
[test @test test]# ls test? <==那個 ? 代表後面『一定』要接『一個』字元
[test @test test]# ls test??? <==那個 ??? 代表『一定要接三個』字元!
[test @test test]# cp test[1-5] /tmp <==將 test1, test2, test3, test4, test5 若存在的話,就拷貝到 /tmp 下
[test @test test]# cd /lib/modules/`uname -r`/kernel/drivers <==被 ` ` 括起來的內容『會先執行』!
上面几个例子相当的有趣!尤其是最后面两个!需要注意的是, [] 里面『代表只有一个字元』但是范围可以由 1-5 ,这样来说的话,那么我们如果允许『大写字元』就可以将档案 copy 出来的话,可以这样做:
cp *[A-Z]* /tmp
很有趣吧?! ^_^
此外,那个 `` 里面的『指令』会先被执行,也就是说:
1. 系统先执行 uname -r 找出输出的结果;
2. 将结果累加在目录上面,来执行 cd 的功能!
很棒吧!!这些基本的功能需要特别来了解一下才行呦!
绝对路径与相对路径
其实,在使用 bash 还有另一个困扰,就是当你的 PATH 没有设定完整的时候,下达指令都是要以『一长列的指令连带根目录都要列出来』,呵呵那就是绝对路径的设定法啦!基本上,这个『绝对路径』与『相对路径』的观念是很重要的!否则你将常常会找不到档案说!所谓的『绝对路径』就是以根目录开始写入到档案的一种命令写定方法,举例来说,我目前在 /home/test 这个 test 使用者的家目录中,我想要看看里面的 .bashrc 这个档案的资料,使用的是 more 这个指令,而这个指令在 /bin/more 当中,则正确的下达指令的方法为:
[test @tset test]# /bin/more .bashrc <==我在的目录为 /home/test !这是绝对路径写法!
而如果你还记得我们在 档案系统指令 那一篇文章中提到的观念的话,那么应该记得使用 ls -al 时会出现两个一定存在的目录,分别是『.』与『..』,分别代表是『这个路径』,与『上一层路径』!
[test @tset test]# ls -al
total 728
drwx------3 vbirdvbird4096 May 19 14:53 . <==這一層路徑的屬性說明
drwxr-xr-x3 root root 4096 May 5 16:50 .. <==上一層路徑的屬性說明
以下略!
所以说,要执行上一层目录中的命令,可以下达『 cd ../command 』那个 command 指的是存在的可执行档!那么我因为在 /home/test 里面,距离 /bin 有两层上层目录,所以我要使用 /bin/more 这个执行档,并且使用相对路径的方法,就必须使用:
[test @tset test]# ../../bin/more .bashrc<==一层一层回到根目录,在进入 /bin 的写法!相对路径
这种相对路径的方法相当广泛的被运用于 script 当中,这是因为如前面提到的,每个人的安装预设的目录都不相同,则使用相对路径的话,很容易就可以找到套件之间相依软体或者是设定档案的相关性!
关于路径搜寻的问题!为何不执行目前所在目录下的档案?咦!刚刚不是提到『.』与『..』吗?那么那个『 . 』是干嘛用的?!眼尖的朋友应该已经发现了,就是『我在执行档案的时候,基本上,并不会主动搜寻目前目录下的档案』举个例子来说,我安装的 squid 这个执行档在 /usr/local/squid/bin/squid 这个档案,然而我在 /usr/local/squid/bin 下达 squid 的时候,系统会告诉你『查不到这个档案!』真是见鬼了!明明有这个档案的呀!这是因为系统预设的 PATH (路径)并没有执行目前目录下的设定,也就是『.』这个路径!你可以使用『 echo $PATH 』看看,就可以知道为什么了!那么为何不要设定这个路径呢?这是因为『安全』的考量。由于系统预设是允许任何人在 /tmp 底下写入任何档案的,那么万一有居心不良的使用者或者是 Cracker 入侵你的电脑,并在你的 /tmp 里头埋了一个小木马,并取名为 ls ,好了,改天你以 root 身份登入后,到 /tmp 底下,并执行 ls ,你看会有什么结果?!这个 /tmp/ls 由其他身份的人来执行或许没有问题,但是由 root 来执行却可能会导致 Cracker 所乐意见到的结果!那晓得为何了吧?!当然啰!您还是可以选择在 ~/.bashrc 当中设定你的 . 在你的 PATH 当中,不过并不这么建议就是了!
好了,由于系统预设并不主动搜寻目前目录下的执行档,那么你应该如何执行『目前目录下的执行档』呢?很简单呀!就是以相对路径的观念,由于『 .. 』是上层,而『 . 』是这一层,所以要执行这一层目录的命令就使用『 ./command 』即可!例如你的 /usr/local/squid/bin 底下执行 squid 则可以写成:
[test @tset bin]# ./squid <==以相对路径的观念来看!在本目录下达的指令写法!
请特别留意这方面的问题!『新手特别容易犯这个错误呢!』
命令重导向
基本上,这个子题是 bash 相当重要的观念,这里可得花点心思才行呦!
o 什么是『重导向, redirect ?』:简单的说,就是将你目前的所得资料转到其他地方去就是了!例如我们常用的,将目前的萤幕输出资料转到档案中去,就可以这么写:『ls -l / > test 』,那个大于的符号『 > 』就是将输出结果导向到 test 这个档案中的意思啰!这个时候:
§ 如果你执行『 ls -l / 』而已的话,萤幕会将根目录的档案与目录都列出在萤幕上;
§ 但是当使用 > 导向到 test 这个档案中时,则萤幕不会显示任何讯息,但是会将刚刚你执行的结果输出到 test 这个档案中。
所以啰,你只要『 vi test 』一下,就会知道 test 这个档案中记录了刚刚我们执行的资料结果啰!不过,这里需要特别留意的是,当你使用 > 符号将资料由萤幕导向到档案中时,则:
§ 该档案(就是 test )若不存在,系统会自动的将他建立起来,但是,
§ 当这个档案存在的时候,那么系统就会先将这个档案内容清空,然后再将资料写入!
§ 也就是若以 > 输出到一个既存档案中,呵呵,那个档案就会被覆盖掉啰!
除了这个 > 的符号之外,在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:
1. 标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
2. 标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
3. 错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>
注意了!那个 1> 与 2> 之间并没有空白字元!而相关的使用说明可以举例如下
[test @test test]# ls -al > list.txt <==将显示的结果输出到 list.txt 档案中,若该档案以存在则予以取代! [test @test test]# ls -al >> list.txt <==将显示的结果累加到 list.txt 档案中,该档案为累加的,旧资料保留! [test @test test]# ls -al 1> list.txt 2> list.err <==将显示的资料,正确的输出到 list.txt 错误的资料输出到 list.err [test @test test]# ls -al 1> list.txt 2>&1 <==将显示的资料,不论正确或错误均输出到 list.txt 当中! [test @test test]# ls -al 1> list.txt 2> /dev/null<==将显示的资料,正确的输出到 list.txt 错误的资料则予以丢弃!注意!错误与正确档案输出到同一个档案中,则必须以上面的方法来写!不能写成其他格式!
这个观念相当的重要,尤其是在 /etc/crontab 当中执行的时候,如果我们已经知道错误的讯息为何,又不想要让错误的讯息一直填满 root 的信箱,就必须以 2> 搭配 /dev/null 这个垃圾桶黑洞装置,来将资料丢弃!这个相当的重要!
这里我们来说明一下命令重导向里面几个常用的符号与装置:
o < :由 < 的右边读入参数档案;
o > :将原本由萤幕输出的正确资料输出到 > 右边的 file ( 档案名称 ) 或 device ( 装置,如 printer )去;
o >> :将原本由萤幕输出的正确资料输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的资料将以『增加的方式』增加到该档案的最后面;
o 2> :将原本应该由萤幕输出的错误资料输出到 2> 的右边去。
o /dev/null :可以说成是黑洞装置!
好了,对于『 > , >> 』这两个东西有一定的概念之后,我们来深入的谈一谈『命令输出重导向』的观念吧!如前所述,基本上, Linux 执行的结果中,可以约略的分成『正确输出』与『错误输出』两种方式。例如,当你以一般身份执行 find 这个指令时,例如执行『 find / -name testing 』时,由于你是一般身份,又有些资料夹是不允许一般身份者进入的,所以啰,当你使用 find 时,就会有错误讯息发生了!但同时如果有 testing 这个档案在你可以进入的资料夹当中,那么萤幕也会输出到给你看!因此,就具有正确的与错误的输出两种啰!(分别称为 Stdout 与 Stderror)例如下面为执行结果:里面的『 find: /home/root: Permission denied 』就告诉你该资料夹你没有权限进入,这就是错误的输出了,那么『 /home/test/tseting 』就是正确的输出了!
[test @test test]# find / -name testing find: /home/test1: Permission denied <==这是错误的输出 find: /home/root: Permission denied <==这是错误的输出 find: /home/masda: Permission denied <==这是错误的输出 /home/test/testing<==这是『正确』的输出 [test @test test]#
好了,那么假如我们想要将资料输出到 list 这个档案中呢?执行『 find / -name testing > list 』会有什么结果?呵呵,你会发现 list 里面存了刚刚那个『正确』的输出资料,至于萤幕上还是会有错误的讯息出现呢!伤脑筋!如果想要将正确的与错误的资料分别存入不同的档案中需要怎么做?!呵呵!其实在资料的重导向方面,正确的写法应该是『 1> 』与『 2> 』才对!但是如果只有 > 则预设是以 1> 来进行资料的!那个 1> 是输出正确资料, 2> 则是错误资料输出项目。也就是说:
· 1> :是将正确的资料输出到指定的地方去
· 2> :是将错误的资料输出到指定的地方去
好了,那么上面的例子中,我们如何将资料输出到不同的地方去呢?可以这么写:
[test @test test]# find / -name testing 1> list_right 2> list_error
这样一来,刚刚执行的结果中,有 Permission 的那几行错误资讯都会跑到 list_error 这个档案中,至于正确的输出资料则会存到 list_right 这个档案中啰!这样可以了解了吗?如果有点混乱的话,去休息一下再来看看吧!!
再来,如果我只要正确的资料,错误的资讯我不要了呢?呵呵,这个时候 /dev/null 这个垃圾桶就很重要了!/dev/null 是什么呢?基本上,那就有点像是一个『黑洞』的垃圾桶功能!当你输入的任何东西导向到这个虚拟的垃圾桶装置时,『他就会凭空消失不见了~~』,这个东西有用的很!例如上面的例子中,我们可以这么做,来将错误的资讯丢掉!
[test @test test]# find / -name testing 1> list_right 2> /dev/null
很神奇呦! error message 就会『不见了!』呵呵!真高兴!另外,如果我要将资料都写到同一个档案中呢?这个时候写法需要用到特殊写法,请注意底下的写法呦!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -