2010-07-15 53 views
4

我注意到當使用間接尋址(<)時,Solaris 10的Bourne shell,/bin/sh(還有/sbin/sh)會生成一個子shell。我已經嘗試了一堆其他的Bourne十歲上下殼,其中包括:Solaris 10/bin/sh間接尋址

  • 在Solaris 10上的POSIX /usr/xpg4/bin/sh外殼
  • /bin/bash/bin/ksh在Solaris 10
  • /bin/sh在AIX 5
  • /bin/sh在Debian Linux上5

並且這些都沒有表現出這種行爲。

我很驚訝我以前沒有被咬過。例如,在更穩健的殼(即,所有上面列出的那些)在以下腳本輸出「1」:因爲賦值x=1所造成的間接子外殼發生

$ cat foo 
#!/bin/sh 
x=0 
while read y ; do 
    x=1 
done </etc/passwd 
echo $x 
$ ./foo 
0 
$ 

的Solaris 10的/bin/sh返回0:當子外殼退出分配失敗。 (如果我刪除</etc/passwd並從stdin中讀取,則按預期輸出「1」)。

是否有一些古老的原因,「傳統」Solaris sh有這個屬性?或者這是一個錯誤?

回答

1

我會說這是違反POSIX標準的。

命令替換,括號括起來的命令和異步列表應在子shell環境中執行。另外,多命令管道的每個命令都在一個子shell環境中;作爲擴展,然而,流水線中的任何或所有命令可以在當前環境中執行。 所有其他命令應在當前shell環境中執行。

來源:Shell Command Language,第2.12節。

+0

同時被視爲命令? – Anders 2010-07-15 11:48:49

+0

是的,下面是使用shell語法(可以在上面的鏈接文檔中找到)的推導:'command - > compound_command - > while_clause' – 2010-07-15 13:12:03

+4

Solaris 10和更早發行版中的'/ bin/sh'命令記錄爲不符合POSIX標準 - 對於符合POSIX標準,您需要使用'/ usr/xpg4/bin/sh'(實際上它基於ksh88而不是Bourne shell)。 – alanc 2010-07-15 14:50:04

1

Bourne shell執行此操作 - 創建子進程 - for循環和其他構造。這是預期的行爲。這不是一個錯誤,任何使用它的人都知道這個問題存在。有時候這是一個糟糕的假設。

除了Solaris系統(例如:啓動/關閉)腳本之外,不要在Bourne中開發。改用POSIX shell:ksh,bash。 root的默認shell必須是Bourne shell,否則系統將無法啓動。這是舊系統V的僞像。

在csh中存在相同類型的警告。它還沒有準備好黃金時段。

+0

我相信bash是POSIX兼容的--posix選項。 – Anders 2010-07-15 12:21:08

+0

我相信即使使用--posix選項,bash也不符合POSIX標準,但這是另一回事:)嘗試一下,例如'echo {a,b}'。在POSIX shell中它應該打印'{a,b}'。 – 2010-07-15 13:14:24

+0

你是正確的先生,http://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html也明確指出「將導致Bash更符合posix標準」 – Anders 2010-07-15 13:20:29