簡體   English   中英

shell 如何運行 sh 腳本?

[英]how does shell run sh scripts?

我們知道,每次用戶通過向 shell 鍵入可執行目標文件的名稱來運行程序時,shell 都會創建(使用fork )一個新進程,然后加載(使用execve )並在以下上下文中運行可執行目標文件這個新流程。

以下是我對shell內部工作原理的理解,如果我錯了,請糾正我:

lscat等命令是可執行對象(C 編寫的源文件)位於/bin/目錄中。 例如,當用戶輸入 bash shell ls來列出文件和目錄時,bash shell 會解釋ls命令並派生一個子進程來運行ls

Q1-我的理解正確嗎?

Q2-如果我的理解是正確的,那么當 shell 運行 .sh 腳本文件時:

#!/bin/sh
echo "what is your name?"
read name

所以 shell 為echoread分叉了兩個子進程,那么這兩個進程是如何相互通信的呢? 我的意思是如何將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM