我想調用/ 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允許這兩者,那麼如何移植它?
對於好的措施:'/ bin/sh -c + x'是做什麼的? –
@bishop我不這麼認爲。 '/ bin/sh'只會看到'-c'和'+ x'這兩個參數,所以'getopt()'應該把它看作'/ bin/sh -c + x'。 –
'sh'的POSIX參考文件位於:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html –