我经常看到类似的东西
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
未导出,因此在sh
shell 中不可用。