[英]how does shell run sh scripts?
我們知道,每次用戶通過向 shell 鍵入可執行目標文件的名稱來運行程序時,shell 都會創建(使用fork
)一個新進程,然后加載(使用execve
)並在以下上下文中運行可執行目標文件這個新流程。
以下是我對shell內部工作原理的理解,如果我錯了,請糾正我:
ls
、cat
等命令是可執行對象(C 編寫的源文件)位於/bin/
目錄中。 例如,當用戶輸入 bash shellls
來列出文件和目錄時,bash shell 會解釋ls
命令並派生一個子進程來運行ls
Q1-我的理解正確嗎?
Q2-如果我的理解是正確的,那么當 shell 運行 .sh 腳本文件時:
#!/bin/sh
echo "what is your name?"
read name
所以 shell 為echo
和read
分叉了兩個子進程,那么這兩個進程是如何相互通信的呢? 我的意思是如何將echo
進程的返回輸出傳遞給read
進程?
我的理解正確嗎?
一般來說,是的。 但可執行文件不一定在/bin/
。 在PATH
環境變量中指定的PATH
搜索名為ls
的文件並使用匹配項。 該文件可以在/usr/bin
/usr/sbin
/usr/local/bin
等。
ls
可能是一個內置函數。 或者一個函數。 或者別名。
所以 shell 為 echo 和 read 分叉了兩個子進程
這就是“內置”的用武之地。內置是由外殼內部處理的外殼的內部部分。 沒有fork
,只運行一些內部代碼,這樣它就可以修改環境變量。 echo
不一定是內置函數,它只輸出數據。 但是read
必須特別處理,並且很可能是一個內置函數來修改name
變量(沒有要求 read 是內置的,它可能不是,但通常 shell 編寫者通過使read
成為內置函數來解決這個問題)。
在bash
您可以使用 type 檢查命令的type
。 前任。 type echo
顯示echo is a shell builtin
。
我的意思是如何將 echo 進程的返回輸出傳遞給 read 進程?
它沒有。
您可能想閱讀posix 命令搜索和執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.