作者 主題: 請教 "login shell" 的定義  (閱讀 34228 次)

0 會員 與 1 訪客 正在閱讀本文。

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 於: 2005-07-05 07:13 »
如題,請教前輩:
su 以及 shell script 兩者個別啟動的 subshell 算是 "login shell" 嗎?

philips0415

  • 可愛的小學生
  • *
  • 文章數: 5
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #1 於: 2005-07-05 09:42 »
su - xxx 應該是login shell

HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3980
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #2 於: 2005-07-05 09:49 »
login shell 應該是看你有沒有登入吧!

跟用 su 或是 scripts 沒有關係。

執行某些 scripts 的時候是未登入的狀態!就是沒有 login shell 啦~~
我做人那麼 nice, 肯定有什麼誤會.....

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #3 於: 2005-07-05 11:52 »
引述: "HaWay"
login shell 應該是看你有沒有登入吧!

跟用 su 或是 scripts 沒有關係。

執行某些 scripts 的時候是未登入的狀態!就是沒有 login shell 啦~~

su 以及 shell script 兩者個別啟動的 subshell 算是 "login shell" 嗎?

我是在 O'REILLY - UNIX 超級工具一書中讀到 ( 3.3 節 - Shell 設定檔):
除了類似以 bash -l 強迫外,subshell 絕不會是 login shell!
可是例如執行 su root 指令就是會啟動一個 subshell ,且又有登入的意涵存在(因須打密碼)....所以才有此疑問??
->
我試過執行 bash 與 bash -l ,除了又開了個 shell (subshell) 外,感覺上並無什麼不同! 一般是什麼情況會執行 bash 還須加上 -l 的?


然後在24.4 節 - Subshells  ,又提到:
shell 命令搞(script)是在 subshell 中執行的.
( 除非是特別使用了 source 或 . 指令來啟動命令搞)....所以才有此疑問??


此外,還有提到透過 ftp 連上系統所啟動的是非登入型shell,請問此情況為何須啟動 shell ?
那麼若是以 ssh 的方式連上系統是否即獲得了個 login shell ?


最後,想請問的是:
UNIX 許多服務或程式只要開了機就會運作即便 root 並無登入.
既然無 login shell 啟動,也就是沒有 shell 設定檔可讀取.
那麼他們若有使用環境變數的需求時,該讀取哪些檔案以獲的初始設定?

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #4 於: 2005-07-05 13:24 »
man su,
看看 - 或 -l 的用途?

再思考有之或無的差異在哪?

HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3980
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #5 於: 2005-07-06 00:10 »
引述: "b90220208"

su 以及 shell script 兩者個別啟動的 subshell 算是 "login shell" 嗎?


login shell 只有一個就是 [root@xxx root] # <= 這個

當你透過 command line 的方式執行 su 或是 scripts 都是一個 subshell .

login shell +---> subshell(su or scripts).



引述: "b90220208"


我是在 O'REILLY - UNIX 超級工具一書中讀到 ( 3.3 節 - Shell 設定檔):
除了類似以 bash -l 強迫外,subshell 絕不會是 login shell!
可是例如執行 su root 指令就是會啟動一個 subshell ,且又有登入的意涵存在(因須打密碼)....所以才有此疑問??
->
我試過執行 bash 與 bash -l ,除了又開了個 shell (subshell) 外,感覺上並無什麼不同! 一般是什麼情況會執行 bash 還須加上 -l 的?


然後在24.4 節 - Subshells  ,又提到:
shell 命令搞(script)是在 subshell 中執行的.
( 除非是特別使用了 source 或 . 指令來啟動命令搞)....所以才有此疑問??



bash -l 跟 su -l 差不多,你這樣換看不太出來,換個身份就知道了。
答案是什麼?   :D  搜尋一下吧!

代碼: [選擇]

example1:
[user1@home user1] $ echo $PATH
xxxxx:xxxxxxx:xxxxxxx
[user1@home user1] $ su root
[root@home user1] $ echo $PATH
??

example2:
[user1@home user1] $ echo $PATH
xxxxx:xxxxxxxx:xxxxxxx
[user1@home user1] $ su -l root
[root@home root] $ echo $PATH
??


答案在 http://tnlug.linux.org.tw 的活動紀錄
裡面有人講過 shell 去看看吧 :wink:

引述: "b90220208"

此外,還有提到透過 ftp 連上系統所啟動的是非登入型shell,請問此情況為何須啟動 shell ?
那麼若是以 ssh 的方式連上系統是否即獲得了個 login shell ?



只要你有看到 shell prompt 就是 login shell. 啥麼是 shell prompt?

搜尋搜尋搜尋搜尋 XD

引述: "b90220208"


最後,想請問的是:
UNIX 許多服務或程式只要開了機就會運作即便 root 並無登入.
既然無 login shell 啟動,也就是沒有 shell 設定檔可讀取.
那麼他們若有使用環境變數的需求時,該讀取哪些檔案以獲的初始設定?


請 man bash 看 INVOCATION 一節

另外一題,樓上的是 shell 高手~發這篇有壓力的說  8)
我做人那麼 nice, 肯定有什麼誤會.....

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #6 於: 2005-07-06 15:52 »
shell-->------->----->
|__________|    
ls    

上圖是您影片中提到的 subshell 的觀念,
我不懂為何要執行 ls 需要再開個 subshell 來執行 ?
(...這樣的設計有何好處)

我原本是以為:
$ ls -al     -> 就是直接於 shell 環境下解譯,並執行指令
$ bash test.sh  -> 才是再開個 subshell 以執行命令稿中的指令

不好意思,能否麻煩您指點迷津一下...


還有,
最近學到在 subprocess 會繼承父行程的行程資訊的觀念下:
其實有例外,例如"自定變數",除非 export 否則並不會被繼承
那麼"環境變數"呢?
..經測試好像會被繼承,想請問的是環境變數是否可想成類似 php 的 superglobal variables 呢?
( 那麼 subprocess 在繼承時,又是到哪兒去找到環境變數的值呢 ? )


最後,
例如:
$ bash
$ UMASK=384
$ su root
# echo $UMASK
我在某個 subshell 更改了環境變數,然後再開個 subshell,如上執行 su root 後,
既然我動的是環境變數 UMASK ,那麼為何沒被繼承呢?
( 我意思是環境變數既然被定義成可繼承到子程序,為何還須作 export 呢? )

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #7 於: 2005-07-06 17:46 »
我目前的觀念是:

引用
像是用su - 或 bash --login 或 bash -l 或 bash -都是subshell,而這些subshell的環境都與login shell相同.


執行ls的情形是:

引用
shell process 呼叫fork system call 產生該shell process的一個複製.

接著這個複製出來的shell process呼叫exec system call以ls覆寫該shell process成為ls process,這也就是所謂的spawn,也就是子行程產生的方式.

shell process --|
       <fork>
        |--> shell(copy) process --<exec>--> ls process


有錯請指正呀!  ^^

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #8 於: 2005-07-06 17:58 »
感謝您的回應,
引述: "ericshei"
我目前的觀念是:

執行ls的情形是:

引用
shell process 呼叫fork system call 產生該shell process的一個複製.

接著這個複製出來的shell process呼叫exec system call以ls覆寫該shell process成為ls process,這也就是所謂的spawn,也就是子行程產生的方式.

shell process --|
       <fork>
        |--> shell(copy) process --<exec>--> ls process


有錯請指正呀!  ^^


這是 ls 程序產生(spawn)的過程,然我不懂的是:解譯 ls 指令的 shell 為何不是 user 輸入指令當下所處的 shell ,而還要再開個 subshell 去解譯並執行 ls 呢 ?..(嗯,我只是想知道會這樣設計的原理為何,是不是有什麼好處或考量)

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #9 於: 2005-07-06 17:58 »
引述: "b90220208"


還有,
最近學到在 subprocess 會繼承父行程的行程資訊的觀念下:
其實有例外,例如"自定變數",除非 export 否則並不會被繼承
那麼"環境變數"呢?
..經測試好像會被繼承,想請問的是環境變數是否可想成類似 php 的 superglobal variables 呢?
( 那麼 subprocess 在繼承時,又是到哪兒去找到環境變數的值呢 ? )


export之後就成為環境變數了.


引用
最後,
例如:
$ bash
$ UMASK=384
$ su root
# echo $UMASK
我在某個 subshell 更改了環境變數,然後再開個 subshell,如上執行 su root 後,
既然我動的是環境變數 UMASK ,那麼為何沒被繼承呢?
( 我意思是環境變數既然被定義成可繼承到子程序,為何還須作 export 呢? )


我沒研究過su的運作方式,不過若在執行bash會去執行到/etc/bashrc檔(這裡以RH9來說),而umask會在這個檔被重設,為什麼會如此:haway大經提到 "請 man bash 看 INVOCATION 一節" 然後你再去tracert 其中所提到的~/.bashrc等shell script.


若有錯請指正呀!!  ^^

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #10 於: 2005-07-06 18:05 »
引述: "b90220208"
引述: "ericshei"
我目前的觀念是:

執行ls的情形是:

引用
shell process 呼叫fork system call 產生該shell process的一個複製.

接著這個複製出來的shell process呼叫exec system call以ls覆寫該shell process成為ls process,這也就是所謂的spawn,也就是子行程產生的方式.

shell process --|
       <fork>
        |--> shell(copy) process --<exec>--> ls process


有錯請指正呀!  ^^


這是 ls 程序產生(spawn)的過程,然我不懂的是:解譯 ls 指令的 shell 為何不是 user 輸入指令當下所處的 shell ,而還要再開個 subshell 去解譯並執行 ls 呢 ?....感激不盡#


我猜您誤會了,在下這裡所表示的是"fork"出一個shell process的複製,而不是subshell(我不確定這叫不叫subshell),而這個動作純粹只是為了要產生ls 這個process的手段(shell的複製是手段,以ls覆寫成為ls process才是目的).

而如上所提的,並不是指"執行shell script時的subshell"

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #11 於: 2005-07-06 23:48 »
我個人覺得跑 ls 不算是產生 sub shell.
但是 current shell 會現 fork 出一個 child process, 也就複制它自己. 然後再 exec 移交給 ls 執行...

若是 sub shell, 則是 current shell 先 fork 出自己, 再 exec 給 sub shell ...

HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3980
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #12 於: 2005-07-07 00:16 »
哈哈!!說真的~為什麼一定要跑 subshell

我不知道~ XD,或許這應該去問問設計 shell 的人 ^^"

我只是有分別 subshell 的概念而已。

subprocess 怎麼去找環境變數我也不知道 :p

我只知道我要找環境變數的話是用 env

去翻 fork 的程式碼或許就知道了.......Orz

代碼: [選擇]


最後,
例如:
$ bash
$ UMASK=384
$ su root
# echo $UMASK
我在某個 subshell 更改了環境變數,然後再
既然我動的是環境變數 UMASK ,那麼為何沒被繼承呢?
( 我意思是環境變數既然被定義成可繼承到子


看不懂!能否詳解?
我做人那麼 nice, 肯定有什麼誤會.....

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #13 於: 2005-07-07 00:52 »
感謝各位的回應!

首先,關於 netman 兄提到:
引用
我個人覺得跑 ls 不算是產生 sub shell.

與 HaWay 兄的影片連結中說的不一樣,因為一連好幾個問題我都是用 --執行指令其實是在 subshell 中解譯的角度來發問....有點混亂了.
那麼若執行: shell> mysqld_safe &
請問 netman 兄,這程式是在當下所處之 shell 執行的,還是須再開個  subshell 去執行呢 ?


HaWay 兄:
關於例子,
$ UMASK=384
$ bash
$ echo $UMASK

以 (sub)shell 的角度來看,已知:
export 過的變數在目前 shell 之下的所有 subshell 都會被繼承,
反之則只會在目前 shell 有作用,subshell 則否! 所以,以上的 echo 絕不會等於 384.

而若改以 (sub)process 的角度來看,已知:
子程序會繼承父程序的 UID , GID , 環境變數(HOME,UMASK)...等等

我主要是想問:
若例中的變數不是 UMASK 而改成普通的自定變數例如 a=123,
那麼,除非有作 export a,否則因"自定變數"不會自動繼承到子程序,所以最後的 echo 一定不是 123 !
可是上例中 UMASK=384 ,其可是個"環境變數"的設定啊,既如此,為何還須作 export UMASK 才能有繼承的效果 ?? ...是不是我有哪邊的觀念沒搞懂啊...

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #14 於: 2005-07-07 00:53 »
最後,
-----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *p = getenv("a");

    if (p == NULL)
     fprintf(stderr, "Cannot locate variable a\n");
    else
     printf("a = %s\n", p);

    return 0;
}
----------------------------------------------------------

假設以上是執行檔 /tmp/foo 的 source code ,那麼當我執行了:
# export a=2
# /tmp/foo &

Q1.
首先請問 foo 的執行是否是在 subshell 下作的(一如 shell script 一樣的觀念)?
若是,總而言之是否不論我在 shell 提示符後作任何事--例如:一般指令export,vi..,或者 shell script等,都會再開個 subshell 來執行之?
( 當然,變數設定,例如執行 # b=100 應該不是在 subshell 作的,因為該變數是設給當下的 shell 用的,對嗎 ? )


Q2.
若以 SHELL 來看,以上兩動作是否一共有 3 個 SHELL 環境( 一父: login-shell , 二子: nonlogin-shell ) ?
若以 PROCESS 來看,則一共牽涉有 5 個 PROCESS( 3 個 shell , 1 個 export a=2 , 1 個 /tmp/foo & ),而誰是誰的 SUBPROCESS 呢?


Q3.
為執行 export,或 foo 所開的 subshell 是否在執行完後即關閉/結束 ?


Q4.
關於 ericshei 兄提到的:
引用
像是用su - 或 bash --login 或 bash -l 或 bash -都是subshell,而這些subshell的環境都與login shell相同.

請教,這些指令所啟動的 subshell 都算是 login shell 嗎 ?

wilson

  • 俺是博士!
  • *****
  • 文章數: 1821
  • 帥氣柴老大
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #15 於: 2005-07-07 02:29 »
或許我是在狀況外~不過參考一下~

http://phorum.study-area.org/viewtopic.php?t=18570&highlight=fork

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #16 於: 2005-07-07 11:48 »
引述: "b90220208"
感謝各位的回應!

首先,關於 netman 兄提到:
引用
我個人覺得跑 ls 不算是產生 sub shell.

與 HaWay 兄的影片連結中說的不一樣,因為一連好幾個問題我都是用 --執行指令其實是在 subshell 中解譯的角度來發問....有點混亂了.
那麼若執行: shell> mysqld_safe &
請問 netman 兄,這程式是在當下所處之 shell 執行的,還是須再開個  subshell 去執行呢 ?


插花一下!  shell>   這是什麼?是代表shell prompt嗎?若然就只是當下shell的一個”sub process”而己. 您這裡的mysqld應該不是個shell script吧!?  ^^
執行binary code是不會有sub shell的.

用pstree驗證!



引用
HaWay 兄:
關於例子,
$ UMASK=384
$ bash
$ echo $UMASK

以 (sub)shell 的角度來看,已知:
export 過的變數在目前 shell 之下的所有 subshell 都會被繼承,
反之則只會在目前 shell 有作用,subshell 則否! 所以,以上的 echo 絕不會等於 384.

而若改以 (sub)process 的角度來看,已知:
子程序會繼承父程序的 UID , GID , 環境變數(HOME,UMASK)...等等

我主要是想問:
若例中的變數不是 UMASK 而改成普通的自定變數例如 a=123,
那麼,除非有作 export a,否則因"自定變數"不會自動繼承到子程序,所以最後的 echo 一定不是 123 !
可是上例中 UMASK=384 ,其可是個"環境變數"的設定啊,既如此,為何還須作 export UMASK 才能有繼承的效果 ?? ...是不是我有哪邊的觀念沒搞懂啊... :wink:


我環境中預設沒有UMASK這個環境變數耶!   :roll:

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #17 於: 2005-07-07 12:16 »
good disscusion!

延伸一問:
請問 sub shell 跟 nested sub shell 差在哪?

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #18 於: 2005-07-07 15:35 »
感謝 wilson 提供的連結,的確幫到了我.

我上文舉的例子:
# export a=2
# /tmp/foo &
就目前整理的結論大概是(有誤請指正)--
因 foo 是個 C 編出來的可執行檔,所以不需要用到 shell 去解譯因此也就不會有 subshell 的需求
另外, export 因為是 bash 內建命令所以不會有 subshell 的需求
所以結論是一共牽涉到:
一個 shell (login shell), 二個 process (login shell, /tmp/foo) , /tmp/foo 為 login shell 的子程序!


還有關於"環境變數"為何能被一路繼承的疑問:
有前輩提到執行:
$ export
declare -x HOME="/home/WILLIE"
.
.
declare -x USER="WILLIE"
便可看出環境變數早已在 login 時被 export 過了
所以任何的更改都會被 subshell 繼承
( 抱歉 ericshei 兄,清單中的確沒有 UMASK )


而關於 netman 提的 subshell 跟 nested sub shell 的差別?
我的理解是,例如:
( ) 是把其內所有指令置於 subshell 去執行,此時好像就算是 nested sub shell 吧?
其不像 { } 是將指令群組在 current shell 下完成,所以若有涉及變數值的改變就不會影響到 current shell.
->
不大了解 netman 的用意,是要提示我什麼嗎?



Q:
最後還是老問題--
請教有哪些情形是會產生 subshell 的 ?
->
我只知有:
shell escape
shell script
$ bash
$ su user

Q:
而當執行 $ su user 所涉及的過程是否為:
login(current) shell 先 fork 出一個 child process 然後再 exec 給 su 執行
然後 su 再 fork 出一個 child process, 再 exec 給 subshell  
所以,最終的新 shell 是 su 的 subprocess,而 su 是原 login shell 的 subprocess
以上若有誤請前輩指正...那麼最上層可算是所有下層 process 的父行程嗎?
而 su 啟動的 subshell 算是原 login shell 的 subprocess 嗎?


Q:
若我以普通帳戶 jordan 登入
[jordan@localhost ~]$ su root
[root@localhost jordan]# ifconfig -a
command not found
[root@localhost jordan]# su -l root
[root@localhost ~]#  ifconfig -a
結果就可執行了!
-->
我知道 ifconfig -a 指令非一般帳戶者可用,只是 su root 與 su -l root
的差別在哪?...為何只有後者可執行 ifconfig -a 呢 ?
...既然執行了 su root 就表示新 process (subshell) 的 UID 已換成了 root 不是嗎 ? 為何還是不能執行 ifconfig -a 呢?


Q:
執行 $ export 某變數
是釋出給 subshell 還是 subprocess 的 ?

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #19 於: 2005-07-07 15:59 »
引用
Q:
最後還是老問題--
請教有哪些情形是會產生 subshell 的 ?
->
我只知有:
shell escape
shell script
$ bash
$ su user


執行/etc/shells檔中所列的那些shell都會,上述的nested sub shell也是囉!!


引述: "b90220208"


Q:
而當執行 $ su user 所涉及的過程是否為:
login(current) shell 先 fork 出一個 child process 然後再 exec 給 su 執行
然後 su 再 fork 出一個 child process, 再 exec 給 subshell  
所以,最終的新 shell 是 su 的 subprocess,而 su 是原 login shell 的 subprocess
以上若有誤請前輩指正...那麼最上層可算是所有下層 process 的父行程嗎?
而 su 啟動的 subshell 算是原 login shell 的 subprocess 嗎?


用pstree去試不就知道了?

 $ su user
 $ pstree

觀念對了就好!你喜歡,叫它祖行程,孫行程也行,從init下來,你要列個祖普也行.開個小玩笑!
 
:P

引用
Q:
若我以普通帳戶 jordan 登入
[jordan@localhost ~]$ su root
[root@localhost jordan]# ifconfig -a
command not found
[root@localhost jordan]# su -l root
[root@localhost ~]#  ifconfig -a
結果就可執行了!
-->
我知道 ifconfig -a 指令非一般帳戶者可用,只是 su root 與 su -l root
的差別在哪?...為何只有後者可執行 ifconfig -a 呢 ?
...既然執行了 su root 就表示新 process (subshell) 的 UID 已換成了 root 不是嗎 ? 為何還是不能執行 ifconfig -a 呢?


看看ifconfig的指令是存在那?
再用su root去echo $PATH有那些路徑?
再用su -l root去echo $PATH有那些路徑?

這裡的問題,跟UID是不是root無關,跟權限也無關,只是ifconfig有沒有在搜尋路徑而己!


引用
Q:
執行 $ export 某變數
是釋出給 subshell 還是 subprocess 的 ?


嗯.....subshell是不是一個subprocess ??

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #20 於: 2005-07-07 16:11 »
還有關於"環境變數"為何能被一路繼承的疑問:


process 在fork時除了複製自己的code之外還會一同複製其它東西,其中便包含了"環境變數",而再以exec覆寫時是覆寫code的部份,因此除了code(還有PPID)之外其它東西基本上都不變,"環境變數"就是這樣繼承來的.

大概是這樣拉!我沒法解析的太細....因為我太淺了~~~  XD

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #21 於: 2005-07-07 16:18 »
man bash 的 INVOCATION 有提到 login shell 會跑哪些 file ; non-login shell 又跑哪些.

然後, 你就知 su - 跟 su 差了哪些.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #22 於: 2005-07-07 16:23 »
env variable 會被繼承是對的.
但在 invocation 時, 被 reset 了. 前面不是有朋友指出了??

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #23 於: 2005-07-07 16:25 »
eric, 你找出了 nested sub shell 差在哪了嗎??

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #24 於: 2005-07-08 14:30 »
我還是想不出來啊...可提示一下嗎?


還有我想將man bash的內容丟到win32下觀看
由於英文能力不佳,所以想用翻譯軟體來看,因為linux沒裝.

我掛載了xp的分割區(ntfs)如下:
# mount -o rw /dev/hdb3 /mnt/xp

然後執行:
# man bash > /mnt/xp/man_bash.text

但系統卻告訴我說:
can't create regular file , 唯讀的檔案系統!

...我既已下了 rw 參數,為何無法建立檔案呢?

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
請教 "login shell" 的定義
« 回覆 #25 於: 2005-07-08 16:16 »
tips:
A=B
( echo $$; A=C )
echo $A

cat >test.sh <<.
#!/bin/bash
echo $$
A=C
.
chmod +x test.sh
./test.sh
echo $A

xp mount 不起來, 可能是 kernel 對 ntfs 只能 read only.
先寫到 floppy 或 usb disk 吧.
man bash | col -b > bash.man.txt

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #26 於: 2005-07-09 10:33 »
引述: "netman"
eric, 你找出了 nested sub shell 差在哪了嗎??


[ericshei@tc ericshei]$ a=b
[ericshei@tc ericshei]$ echo $a
b
[ericshei@tc ericshei]$ echo $$
2422

[ericshei@tc ericshei]$ (echo $a;echo $$)    <==用nested sub shell
b    <==local variable "a"被繼承了.
2422    <==顯示了parent shell 的PID

[ericshei@tc ericshei]$ ./test.sh    <==用shell script
     <==local variable "a"不會被繼承了.
2509    <==顯示了sub shell 的PID.

[ericshei@tc ericshei]$ cat ./test.sh
#!/bin/bash
echo $a
echo $$

[ericshei@tc ericshei]$ (echo $$;pstree -p)
2422    <==顯示了parent shell 的PID
init(1)┬apmd(1593)
   └login(1792)─bash(2422)─bash(2505)─pstree(2506)    <==sub shell有自己的PID


關於environment的部份:

  用nested sub shell除了env variable之外的環境也會被subshell繼承.

  我能說它是"current shell 僅 fork 出自己,然後就直接執行(cmd)中的cmd"嗎?

關於pid的部份:

  使用()時,關於$$的擴展,會擴展parent shell的值.

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
請教 "login shell" 的定義
« 回覆 #27 於: 2005-07-09 14:18 »
環境變數BASH要export才能變成環境變數
export JAVA_HOME
export PATH CLASSPATH

C SHELL要設環境變數,要用stenv

setenv CLASSPATH ${JAVA_HOME}/usr/java/jdk1.5.0_03/lib/tools.jar : .
setenv CLASSPATH /usr/java/jdk1.5.0_03/lib/tools.jar :.


結果:

[yplin@stc12 ~]$ echo $JAVA_HOME
/usr/java/jdk1.5.0_03/
[yplin@stc12 ~]$ echo $CLASSPATH
/usr/java/jdk1.5.0_03/lib/tools.jar:/home/yplin/JAVA/TEST/layouttools/dist/layouttools.jar:.
[yplin@stc12 ~]$
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #28 於: 2005-07-09 23:20 »
引述: "netman"
tips:
A=B
( echo $$; A=C )
echo $A

-> B
引用

cat >test.sh <<.
#!/bin/bash
echo $$
A=C
.
chmod +x test.sh
./test.sh
echo $A

-> subshell pid
-> B
引用

xp mount 不起來, 可能是 kernel 對 ntfs 只能 read only.
先寫到 floppy 或 usb disk 吧.
man bash | col -b > bash.man.txt

-> 我查過了,果然該ntfs tool 的rpm只支援read而已!

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

eric 兄從技術面分析,我試著從應用面(功力不夠)
例如執行script時,
$ ./test.sh 的 sub shell 是與 parent shell "獨立"開來運作,先由parent shell解譯輸入列的資訊,
再 fork 出自己,並 exec 給 subprocess(即subshell)去解譯 test.sh 中的各行指令,選項,引數...
若非環境變數,就得靠export來繼承.

例如執行
$ a=123
$ (echo $a; echo $$)
current(parent) shell 的解譯需"等待" () 中的指令群組執行完畢才算完整, 所以 () 所用的 sub shell
不若上述例子具有的獨立性
,或許因以上這些特性所以才稱其為 "neted" sub shell.

且 () 的設計本意就是為讓 user 運用上可以更有彈性,既然是讓 user 決定在 current shell 下,哪些可先作
而哪些後作,如此,若不能直接地使用 current shell 的變數豈不失去了其意義!
(總不能每次要用到 "$ (echo $a)" 前就得先做一次 export 一般變數..#$%@)

最後,關於 eric 兄問的技術面我也很想知道,希望 netman 能指點迷津:
引用

用nested sub shell除了env variable之外的環境也會被subshell繼承.

  我能說它是"current shell 僅 fork 出自己,然後就直接執行(cmd)中的cmd"嗎?

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
請教 "login shell" 的定義
« 回覆 #29 於: 2005-07-10 00:02 »
引用
所以 () 所用的 sub shell不若上述例子具有的獨立性


neted sub shell絶對是一個獨立完整的行程(用pstree去看就知到了).


neted sub shell 與 shell script都會產生 sub shell,而netman學長提出要大家討論的是"即然用neted sub shell 與 shell script 都會產生sub shell,那二者的差別在那??"