在什么情况下应该使用“sh -c”而不是直接执行程序?

在什么情况下应该使用“sh -c”而不是直接执行程序?

我经常看到类似的东西

sh -c "curl -o …"

在什么情况下你应该使用它而不是仅仅使用它

curl -o …

答案1

通常,如果可以避免的话,您就不会这样做。你的两个例子基本上是相同的。

然而,这是一种相对常见的模式,您希望在进程内使用 shell 运算符。例如,您使用重定向运算符>或管道|

这两者有细微的不同:

curl -o example.com/foo > foo
sh -c "curl -o example.com/foo > foo"

在第一个中,当前的命令行 shell 创建文件foo并将打开的文件句柄附加到curl.在第二个中,您创建一个新的 shell 进程,该新进程负责创建foo它并将其附加到curl。

为什么你可能需要这个?

权限

当您运行的命令对当前 shell 有不同的约束时,这一点变得非常重要。例如,sudo以与当前 shell 不同的用户身份运行命令。因此这两个是真的不同的:

sudo curl -o example.com/foo > foo
sudo sh -c "curl -o example.com/foo > foo"

在第一种情况下,文件foo由您当前的 shell 打开,因此由您的用户打开或创建。

其次,用户root以不受限制的访问权限打开或创建文件。

延迟 Shell 扩展

另一个原因可能是延迟变量扩展。我没有有用的例子。但在极少数情况下,延迟扩展变量的时间/位置可能会很有用。

hello=wave
echo $hello
hello=wave
sh -c 'echo $hello'

这些实际上会产生不同的结果,因为变量hello未导出,因此在shshell 中不可用。

相关内容