sh -c 命令是什么?

sh -c 命令是什么?

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

答案1

sh调用该程序sh作为解释器,-c标志表示按照该程序的解释执行以下命令。

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

您也可以将此语法(标志-c)与其他解释器一起使用。它的一个经典用法(@edwinksl 指出)是解决使用 sudo 时重定向不起作用的问题(此处您可以使用bash -csh -c

sudo sh -c 'echo "foo" > /home/bar'

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

答案2

论点-c是:

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

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

$ man sh

使用字符串作为参数的示例是:

$ sh -c "echo This is a test string"

这是一个更详细的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"

答案3

sh -c产生一个未登录非交互式sh(在 Ubuntu 中)的会话dash

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

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


需要注意的是,特定于交互的仅限 shell(默认情况下),例如历史记录扩展、source-ing of~/.bashrc/etc/bash.bashrc在此会话中不可用,因为它是非交互式。您可以使用以下选项模拟交互式会话行为(几乎)-i

sh -ic ...

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

sh -lc ...

模拟登录和交互式会话:

sh -lic ...

相关内容