2015-01-09 97 views
-1

我的命令解釋器是bash的shell.After在我的OS(百分之OS)開口端,我已經執行以下命令:在Linux中,sh -c「ps -l」是什麼意思?

場景1

$sh -c "ps -l" 
UID PID PPID TIME  CMD 
3038 2577 2504 00:00:00 bash 
3038 2992 2577 00:00:00 ps 

場景2

$sh  
$ps -l 
UID PID PPID TIME  CMD 
3038 2577 2504 00:00:00 bash 
3038 3005 2577 00:00:00 sh 
3038 3006 3005 00:00:00 ps 

觀察ps的PID和PPID。
在場景1中,我在sh shell上執行ps -l命令。所以它的父應該是sh,即它的PPID應該是sh的PID。但是ps -l命令列表它的父項是bash。我不明白到底發生了什麼。我瞭解方案1方案2之間的差異。但是,當我在另一個操作系統執行相同的命令(Ubuntu的),我在情景讓ps -l下相同的房源爲低於3場景4,:

場景3

$sh  
$ps -l 
UID PID PPID TIME  CMD 
3038 2577 2504 00:00:00 bash 
3038 2991 2577 00:00:00 sh 
3038 2992 2991 00:00:00 ps 

方案4

$sh  
$ps -l 
UID PID PPID TIME  CMD 
3038 2577 2504 00:00:00 bash 
3038 3005 2577 00:00:00 sh 
3038 3006 3005 00:00:00 ps 

在這裏,在這兩個風光arios,我得到ps CMD的PID爲sh的PID。到底發生了什麼。我的解釋錯了嗎?

回答

2

當你輸入一個命令時,bash只是fork然後execve該命令。情況3和情況4是這種情況。

sh -c 'ps -l'依賴於殼。

在我的linux發行版上,ls -l `which sh`的結果是lrwxrwxrwx 1 root root 4 Oct 6 14:06 /usr/bin/sh -> bash

-c存在時,bash execve直接下面的命令。而像fish這樣的另一個shell沒有。

fish -c 'ps -l' F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 711 710 0 80 0 - 5707 wait pts/5 00:00:00 bash 0 S 1000 1519 711 0 80 0 - 7054 wait pts/5 00:00:00 fish 0 R 1000 1526 1519 0 80 0 - 9266 - pts/5 00:00:00 ps

什麼execve並用新的進程映像替換當前的進程映像。 fork創建一個新的過程。