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