linux 子shell subshell和函數


關於子shell, subshell 參考:http://blog.csdn.net/sosodream/article/details/5683515

系統引導時的進程為 "原始進程" id=0, 然后時init 進程, 進程號=1, 后面所有的進程都是它派生出來的. 如果父進程終止導致留下 孤兒 (子進程) 也會被 init所收養.

子進程的創建過程: fork+exec: fork由父進程創建子進程的環境; 然后由exe加載子進程代碼並執行.

shell創建子進程有 四種情況: 后台執行時&; 管道執行時 |; 括號執行時(); 執行外部的程序或命令時.

但是shell也提供了(有兩個不會創建子進程, 直接在當前shell中執行的命令)就是 source和點號命令.


**shell的變量類型: shell變量和shell 環境變量. **
區別是: shell變量只能在當前shell中有效, 而不能在 其子進程中(子shell)中有效.
shell環境變量, 可以在當前shell 及其 subshell中 有效.
但是 不管是什么shell變量(包括shell環境變量), 都只是針對當前shell "當前這個 shell 窗口" 有效的. 即使是在shell中定義的 export環境變量, 也不能在 其他 shell 窗口中生效! 也就是說, 所謂的export是針對 "一個shell窗口的" subshell 子進程而言的. 而兩個 shell窗口是獨立的進程. 當然不能共享.

兩個"shell窗口"間不能共享"export變量", source和點號命令不創建subshell

注意: echo $一個變量, 如果有值, 則輸出該變量的值, 否則會輸出一個空行(包括純粹的echo命令, 也會輸出一個空行)

================

shell腳本什么時候,需要 添加可執行 屬性才能執行?

一個原則, 如果直接運行 該腳本文件, 不借助於 外部的命令 來執行, 則需要設置腳本文件的 可執行屬性, 否則會提示 permission denied . 因為在腳本中已經指名了 執行該腳本的程序, 就是用bash來執行的.
反之, 如果借助外部命令, 如: bash, .點命令, source 則不需要設置 腳本的executable 屬性, 甚至不必 寫 #!/bin/bash.

為什么要用 ./foo.sh 來執行腳本
因為, 如果shell 沒有掃描到 ./ 就會把它當作 $PATH 中的目錄中的命令 去搜索 執行, 就會報錯"foo.sh command is not found. " 的錯誤.

sh腳本異常:/bin/bash^M: bad interpreter: No such file or directory ?

在這里是把 bash^M, 作為一個整體的 shell解釋器, 當然是沒有這樣的解釋器了.

為什么會多一個 ^M 呢?
這個是不同系統的換行符不同引起的.windows的換行符一般都是用\r\n 而Linux/Unix一般只用\n 如果在linux下用\n換行的文本, 用記事本打開時會沒有換行,而用\r\n結尾的文件再linux的vi中顯示時會將\r顯示成^M

\r是回車符,\n是換行符
電傳打字機(Teletype Model 33)的玩意,每秒鍾可以打10個字符, (每個字占0.1秒). 但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。
於是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把 打印頭 定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。
這就是“換行”和“回車”的來歷, \r: return 回車; \n newline 新行, 換行
后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。 於是,就出現了分歧。Unix 系統里,每行結尾只有“<換行> ”,即“\n”; Mac系統里,每行結尾是“<回車>”, 即 "\r", Windows系統里面,每行結尾是“<回車><換行>”,即“ \r\n”;。一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行: 因為沒有回車; 而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號: 其中的\r 變成^M, 而\n就成為 unix的換行了.

**解決方法, 就是, 在vi中, 查看文件格式, set fileformat; 或, set ff=file format. 在windows中創建的就是 ff=dos, 只要重新設置一下, set ff=unix就可以了. **



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM