什么是 sh -c 命令?

Lan*_*... 58 sh

我发现了sh -c命令。我在这里发布之前找到了它,但我找不到任何来自 Google 的帖子解释它,所以我想知道它是什么以及它的完整语法是什么。

Zan*_*nna 55

sh将程序sh称为解释器,-c标志表示执行由该程序解释的以下命令。

在 Ubuntu 中,sh通常符号链接到/bin/dash,这意味着如果您使用sh -c破折号执行命令,shell 将用于执行命令而不是 bash。调用 with 的 shellsh取决于符号链接 - 您可以使用readlink -e $(which sh). sh -c当您想使用该 shell 而不是 bash 专门执行命令时,您应该使用。

您也可以将此语法(-c标志)与其他解释器一起使用。它的一个经典用法(@edwinksl 指出是为了解决重定向不适用于 sudo 的问题(在这里你可以使用bash -cor sh -c

sudo sh -c 'echo "foo" > /home/bar'
Run Code Online (Sandbox Code Playgroud)

将写入文件bar包含文本foo/home/,而sudo echo "foo" > /home/bar失败这里很好的解释

在命令字符串周围使用“单引号”很重要,否则当前 shell 将在将其传递给您调用的解释器之前尝试对其进行扩展。例如python

$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
Run Code Online (Sandbox Code Playgroud)


L. *_*mes 22

-c说法是:

从 command_string 操作数而不是从标准输入读取命令。特殊参数 0 将从 command_name 操作数设置,位置参数($1、$2 等)将从其余参数操作数设置。

sh可以通过运行以下命令找到 arugments 的其他详细信息:

$ man sh
Run Code Online (Sandbox Code Playgroud)

使用字符串作为参数的一个例子是:

$ sh -c "echo This is a test string"
Run Code Online (Sandbox Code Playgroud)

这是一个更详细的sh -c例子。它将从 Google Drive 下载一个文档并将其打开以在桌面上进行编辑:

$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
Run Code Online (Sandbox Code Playgroud)

  • 这个答案以最简单的方式解释了“-c”参数的使用 - 只需将“sh”命令的输入源从 stdin 更改为字符串类型的输入参数。 (4认同)

hee*_*ayl 16

sh -c生成(在 Ubuntu 中)的非登录非交互式会话。shdash

接下来的命令将在该 shell 会话中运行,它将被视为参数(位置参数)0 ( ARGV0),其余部分作为该命令的参数 ( ARGV0),从 1 ( ARGV1, ARGV2, ...) 开始。

您还可以使用允许在此类会话中运行的典型 shell 功能,例如;使用多个命令的命令分离、使用 的命令分组、使用{}生成另一个子 shell()等等。使用这些可以稍微改变前面提到的参数定义/示例。


只是要注意,特定于功能的交互式壳仅(默认),例如历史扩展,source的-ing~/.bashrc/etc/bash.bashrc等不会在本次会议可作为其非交互。您可以使用以下-i选项模拟交互式会话行为(几乎):

sh -ic ...
Run Code Online (Sandbox Code Playgroud)

同样,特定于登录shell的功能(默认情况下)例如source-ing of ~/.profile(给定~/.bash_profile~/.bash_login不存在)并且/etc/profile不会因为 shell是非登录shell 而完成。您可以使用以下-l选项模拟登录外壳行为:

sh -lc ...
Run Code Online (Sandbox Code Playgroud)

模拟登录和交互式会话:

sh -lic ...
Run Code Online (Sandbox Code Playgroud)

  • +1 *“sh -c 生成 sh 的非登录、非交互式会话”* (3认同)