shell – 在/ bin / sh的参数中处理’ – ‘:POSIX与Bash / Dash / FreeBSD的sh的实现

前端之家收集整理的这篇文章主要介绍了shell – 在/ bin / sh的参数中处理’ – ‘:POSIX与Bash / Dash / FreeBSD的sh的实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想调用/ bin / sh,并使用-c选项传递命令’x’,即执行名为’x’的程序,其名称以加号开头.

由于’x’被/ bin / sh解释为一个选项(具体来说,禁用’x’选项),/ bin / sh必须被阻止将其解释为一个选项.我得到以下不同的结果,取决于/ bin / sh我使用:

(1)第一个变体:

/bin/sh -c -- +x

在Linux上使用Dash和Bash:执行命令x.

使用FreeBSD的sh:该命令被执行,x选项被设置.

(2)第二个变体:

/bin/sh -c +x

在Linux上使用Dash和Bash:x选项被设置,并且有一个错误,因为选项-c缺少一个参数.

使用FreeBSD的sh:执行命令x.

(3)第三种变体:

/bin/sh -c - +x

在Linux上使用Dash和Bash:执行x.

使用FreeBSD的sh:命令 – 被执行并且选项x被设置.

(4)第四种变体:(ADDED如意见中的建议)

/bin/sh -c+x

在Linux上使用Dash和Bash:无效/非法选项”

使用FreeBSD的sh:Bad -c选项

我的问题:POSIX规定了什么?

我正在阅读这里的POSIX规范:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

引用它:“单个连字符应被视为第一个操作数,然后忽略,如果” – “和” – “两个作为参数,或者其他操作数在单个连字符之前,则结果未定义.

我不知道这个引号是否也适用于在-c之后放置的单个破折号.

那么,哪一个是对的,Dash / Bash或FreeBSD?或者,如果两者都是正确的,因为POSIX允许两者,如何做到这一点呢?

问题“答案Posix规定了什么”已经存在于OP中.但是,Posix标准的重要特性并没有突出显示:-c选项不参与.

你可以在剧情介绍中看到:

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

-c标志的作用是使位置参数(“操作数”)以不同的方式被解释.没有-c,它们被解释为[command_file [arguments …]]:

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

那么,顺便说一下,为什么sh -c x是一个错误.如果-c采取了一个争论,那么将参数包含在同一个单词中是合法的.

所以,回答更具体的问题:

> Posix说:“一个连字符应被视为第一个操作数,然后忽略…”.这是否适用于 – 紧跟在-c之后?

A:是的,是的. -c是一个完整的选项,因此是一个操作数.相反,在-o中不会被视为一个操作数. (将被视为无效的选项名称.)
>哪一个是正确的,Dash / Bash或FreeBSD?

A:在这种情况下,Dash和Bash符合Posix标准,FreeBSD的sh不是. FreeBSD的外壳大大超过了当前的Posix规范,我不相信它曾经被认为完全符合任何Posix规范.
>我如何可移植地使用sh来运行名称以a开头的命令?

A:我会认为以下内容可以在任何shell上运行:

sh -c " +x"

“x”不会被识别为一个选项,因为它不是以或 – 开头,而sh -c会使操作数被解析为shell命令,因此导致的空白将被忽略.我刚才没有FreeBSD的灰烬副本,所以我欢迎更正.

或者你可以使用一个简单的复合命令:

sh -c "{ +x; }"

可能最清晰(假设你使用的shell实现了Posix标准的内置命令)是:

sh -c "command +x"

猜你在找的Bash相关文章