2016-06-17 61 views
10

我想調用/ bin/sh,並使用-c選項來傳遞命令'+ x'即執行名爲「+ x」的程序,其名稱以加號開頭。由於'+ x'被/ bin/sh解釋爲一個選項(特別是,禁用'x'選項),因此必須防止/ bin/sh將其解釋爲選項。我得到取決於/ bin/sh的我用下面不同的結果:在/ bin/sh參數中處理' - ':POSIX與Bash/Dash/FreeBSD的實現sh

(1)第一變體:

/bin/sh -c -- +x 

在Linux上使用短跑和Bash:命令+ x被執行。

使用FreeBSD的sh:執行命令 - 並設置+ x選項。

(2)第二個變體:

/bin/sh -c +x 

在Linux上使用短跑和Bash:在+ X選項設置,並有一個錯誤,因爲-c選項缺少一個參數。

使用FreeBSD的sh:命令+ x被執行。

(3)第三變體:

/bin/sh -c - +x 

在Linux上使用短跑和擊:+ x被執行。

使用FreeBSD的sh:執行該命令並設置選項+ x。

(4)第四變型:(添加爲建議在評論)

/bin/sh -c+x 

在Linux上使用短跑和Bash:無效/非法選項 '+'

使用FreeBSD的SH:壞-c選項


我的問題:POSIX是什麼規定的?

我讀了POSIX規範SH這裏:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

從中引用:「一個連字符將被視爲第一個操作數,然後忽略如果兩個‘ - ’和‘ - ’是作爲參數給出,或者如果其他操作數在單個連字符之前,結果是未定義的。「

我不確定那個引用是否也適用於在'-c'之後放置的單個短劃線。

那麼,哪一個是正確的,Dash/Bash或FreeBSD?或者,如果兩者都是正確的,因爲POSIX允許這兩者,那麼如何移植它?

+1

對於好的措施:'/ bin/sh -c + x'是做什麼的? –

+0

@bishop我不這麼認爲。 '/ bin/sh'只會看到'-c'和'+ x'這兩個參數,所以'getopt()'應該把它看作'/ bin/sh -c + x'。 –

+1

'sh'的POSIX參考文件位於:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html –

回答

6

OP中已經出現了「Posix指定什麼」這個問題的答案。但Posix標準的重要特徵未突出顯示:-c選項不會採用參數

可以在梗概看到:

sh -c [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]... 
     command_string [command_name [argument...]] 

什麼-c標誌的作用是使該位置參數(「操作數」),以不同的方式來解釋。如果沒有-c,它們被解釋爲[command_file [argument...]]

sh [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]... 
    [command_file [argument...]] 

也就是說,順便說一句,這就是爲什麼sh -c+x是錯誤的。如果-c提出了一個論點,那麼將這個論證包含在同一個詞中是合法的。

因此,要回答的更具體的問題:

  1. Posix的說:「一個連字符將被視爲第一個操作數,然後忽略了......」。這是否適用於-c之後的-?答:是的,它的確如此。 -c是一個完整的選項,因此-是一個操作數。相比之下,-o -中的-不會被視爲操作數。 (這將被視爲無效的選項名稱。)

  2. 哪一個是正確的,Dash/Bash或FreeBSD?答:在這種情況下,Dash和Bash符合Posix,而FreeBSD的sh不符合。 FreeBSD的shell大大超過了目前的Posix規範,我不認爲它曾聲稱完全符合任何Posix規範。

  3. 如何可移植地使用sh來運行名稱以+開頭的命令?

    答:我認爲有以下將在任何shell工作:

    sh -c " +x" 
    

    " +x"將不被認定爲一種選擇,因爲它不具有+-,並且sh -c啓動導致操作數被解析爲一個shell命令,所以前導空格將被忽略。我現在沒有FreeBSD的ash的副本,所以我歡迎更正。

    或者你可以使用一個簡單的複合命令:

    sh -c "{ +x; }" 
    

    可能最清楚的(假設你使用了POSIX標準的內置command殼)是:

    sh -c "command +x" 
    
+0

Typo in answer:'「+ x」' - >'「+ x」'。 – Kusalananda

+0

同樣在這裏:我認爲'sh -c'+ x''可以工作,但我沒有FreeBSD測試,@ Rhymoid的評論勸阻了我。我認爲這樣比較好,因爲'+ x'似乎很棘手(也許很脆弱)。 'sh -c'命令+ x''似乎對移動時的意圖更清楚。 – bishop

+0

如果太空奇怪,'sh -c':; + x''也應該有效。 – melpomene