【问题标题】:What are "double sh" calls?什么是“双 sh”电话?
【发布时间】:2025-11-23 15:00:01
【问题描述】:

你能解释一下什么是(我称之为)“双重 sh 调用”,它们是如何工作的以及这种结构的优点吗?

EDIT1:也许一个例子可以帮助你理解我在说什么。

$ set -- --no-resume-playback https://www.facebook.com/TBN/videos/1580372468665943/
$ sh -c 'echo $*'
$
$ sh -c 'echo $*' sh "$*"
--no-resume-playback https://www.facebook.com/TBN/videos/1580372468665943/

我在 man 中找不到任何这样的例子:

$ man bash | col -b | egrep "sh -c [\"']"
$

注意:如果我的问题的标题不明确,请帮我更改它,因为我不知道如何调用此类 shell 调用。

【问题讨论】:

  • 你的问题是什么?您是否只是想了解sh -c 是什么以及它是如何工作的。如果是这样,您的答案是*.com/q/23951346/5291015
  • @Inian 不。请多花点时间看看我的 EDIT1 及其下面的示例,以便理解我在说什么。
  • @Inian 请重新考虑您的否决票并查看我刚刚更新的 EDIT2 和下面的示例,希望这有助于让我理解。
  • 我没有否决你的问题

标签: bash


【解决方案1】:

man bash 描述了-c 及其参数:

如果存在-c 选项,则从第一个非选项参数command_string 中读取命令。如果 command_string 之后有参数,则将它们分配给位置参数,以 $0 开头。

在这种情况下,command_stringecho $*,位置参数是这样设置的:

$0 = sh
$1 = "$*" = '--no-resume-playback https://www.facebook.com/TBN/videos/1580372468665943/'

【讨论】:

  • 请看我的 EDIT2 和下面我刚刚更新的例子,希望这有助于我理解
  • 你有什么问题?
  • 子shell脚本之后的第二个sh调用是什么:sh -c 'script'
  • 这不是调用,而是分配给$0的值。
  • 如果你的意思是:sh -c 'echo $*' sh "$*",那么第二个sh 就是$0 的值,正如我已经解释过的那样。
最近更新 更多