Shell 第二天
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1. Shell ?引號(hào)
shell 引用類型:
“”雙引號(hào)
‘’單引號(hào)
·· ? 反引號(hào)
\ ? 反斜杠
1.1 單引號(hào),雙引號(hào)
單引號(hào)雙引號(hào)區(qū)別: ?除了類似作用,關(guān)鍵區(qū)別如下:
[nxuser@PSBJ-0-0-0 ~]$ BOY='boy' [nxuser@PSBJ-0-0-0 ~]$ echo $BOY boy [nxuser@PSBJ-0-0-0 ~]$ echo 'the $BOY did well' the $BOY did well [nxuser@PSBJ-0-0-0 ~]$ echo $BOY boy [nxuser@PSBJ-0-0-0 ~]$ echo "the $BOY did well" the boy did well [nxuser@PSBJ-0-0-0 ~]$
含義,會(huì)將引號(hào)里的所有字符,包括引號(hào)都作為一個(gè)字符串。
1.2 反引號(hào)
[nxuser@PSBJ-0-0-0 ~]$ echo date date [nxuser@PSBJ-0-0-0 ~]$ echo "date" date [nxuser@PSBJ-0-0-0 ~]$ echo 'date' date [nxuser@PSBJ-0-0-0 ~]$ echo `date` Thu Apr 17 10:51:01 CST 2014
1.3 反斜線
如果下一個(gè)字符有特殊含義,反斜線防止 s h e l l 誤解其含義,即屏蔽其特殊含義。下述字
符包含有特殊意義: & * + ^ $ ` " | ?
2 執(zhí)行腳本的三種方式
./shell-script.sh其實(shí)就是fork的方式去運(yùn)行一個(gè)程序(這個(gè)程序就是shell腳本)。所以這個(gè)新的shell腳本在運(yùn)行時(shí)擁有父進(jìn)程的一個(gè)環(huán)境變量表的拷貝。所以我們知道了,這種默認(rèn)的shell腳本執(zhí)行是會(huì)創(chuàng)建出新的進(jìn)程的。
而另外還有兩種用法,是不會(huì)創(chuàng)建出子進(jìn)程的,那就是source和exec。
和fork方式不同,source和exec則都會(huì)在當(dāng)前的進(jìn)程內(nèi)去執(zhí)行相應(yīng)的程序。所以就不存在環(huán)境變量的拷貝問(wèn)題,該shell腳本的執(zhí)行直接會(huì)影響 到當(dāng)前的環(huán)境變量表。而且exec還有個(gè)特別之處就是,當(dāng)它執(zhí)行的程序完成之后,所在的進(jìn)程也會(huì)退出。比如在Gnome的terminal中用exec command之后,當(dāng)前的terminal就會(huì)退出,這個(gè)有時(shí)候還很有用。source還有一個(gè)很有趣的縮寫(xiě),也就是一個(gè)點(diǎn)。比如. ./shell-script.sh,是不是很奇怪。
總結(jié)一下
? ? ? ? ? ? ? ? ? ? ? New Process ? ? ? ? ? ?Terminate Current/Parent
-------------------------------------------------------
fork ? ? ? ? ? ? ? ? ? Y ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N
source ? ? ? ? ? ? N ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N
exec ? ? ? ? ? ? ? ? N ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Y
假設(shè)腳本為a.sh,則要運(yùn)行該腳本,有以下方式
1 給腳本加上執(zhí)行權(quán)限chmod u+x a.sh, 而后就可以直接用全路徑來(lái)執(zhí)行腳本了,比如當(dāng)前文件夾下用./a.sh, 如果腳本所在目錄在PATH環(huán)境變量之中, 則直接用a.sh即可
2 sh/bash a.sh的路徑,這種情況不需要腳本具有執(zhí)行權(quán)限.
以上兩種情況中,腳本中$0都是a.sh,都是在shell的子進(jìn)程中運(yùn)行的.
3 source a.sh的路徑
4 . a.sh的路徑
以上兩種情況都是腳本在當(dāng)前shell的進(jìn)程中運(yùn)行,所以$0都是bash/sh, 區(qū)別在于, source不是posix shell的內(nèi)置命令,所以3在sh中實(shí)際上是不能運(yùn)行的,在bash中可以. 而.則無(wú)論在bash還是posix shell中都是可以用來(lái)載入并執(zhí)行腳本. 所以, 相對(duì)而言, 應(yīng)該是4 更加具有移植性.
2、一個(gè)shell中的系統(tǒng)環(huán)境變量會(huì)被復(fù)制到子shell中(用export定義的變量);
3、一個(gè)shell中的系統(tǒng)環(huán)境變量只對(duì)該shell或者它的子shell有效,該shell結(jié)束時(shí)變量消失
(并不能返回到父shell中)。
3、不用export定義的變量只對(duì)該shell有效,對(duì)子shell也是無(wú)效的。
轉(zhuǎn)載于:https://my.oschina.net/hanruikai/blog/223441
總結(jié)
- 上一篇: Java并发教程(Oracle官方资料)
- 下一篇: 物理层与综合布线【笔记】