什么是sh -c命令?


30

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

Answers:


34

sh将该程序sh作为解释程序调用,并且-c标志意味着执行该程序解释的以下命令。

在Ubuntu中,sh通常与链接/bin/dash在一起,这意味着,如果使用sh -c破折号外壳执行命令,则将使用该命令代替bash来执行命令。调用with的shell sh取决于符号链接-您可以通过找到readlink -e $(which sh)sh -c当您要专门使用该shell而不是bash执行命令时,应使用。

您也可以将此语法(-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

您能否提供一个使用示例sh -c?如果它演示的-c部分中提到的位置参数的分配,那就更好了man sh
edwinksl

15

-c说法是:

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

sh可以通过运行以下命令找到其他细节:

$ man sh

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

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

这是一个更详细的sh -c示例。它将从Google云端硬盘下载文档,然后将其打开以在桌面上进行编辑:

$ 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"

11

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

将在该壳会话中运行的命令下文中,将被当作参数(位置参数)0( ARGV0),以及作为参数到该命令(的剩余部分ARGV0),从1开始(ARGV1ARGV2,...)。

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


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

sh -ic ...

同样,仅(默认)仅适用于登录 shell 的功能,例如source-ing ~/.profile(给定~/.bash_profile~/.bash_login不存在),并且/etc/profile由于该shell 是非登录 shell 而不会执行。您可以使用以下-l选项模拟登录shell行为:

sh -lc ...

模拟登录和交互式会话:

sh -lic ...

+1 “ sh -c生成sh的非登录,非交互会话”
JSON C11
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.