我发现了该sh -c
命令。我在发布之前就发现了它,但我在 Google 上找不到任何解释它的帖子,所以我想知道它是什么以及它的完整语法是什么。
答案1
sh
调用该程序sh
作为解释器,-c
标志表示按照该程序的解释执行以下命令。
在 Ubuntu 中,sh
通常符号链接到/bin/dash
,这意味着如果您使用sh -c
dash 执行命令,则将使用 shell 而不是 bash 来执行该命令。使用 调用的 shellsh
取决于符号链接 - 您可以使用 找出。当您想使用该 shell 而不是 bash 专门执行命令时,readlink -e $(which sh)
应该使用。sh -c
您也可以将此语法(标志-c
)与其他解释器一起使用。它的一个经典用法(@edwinksl 指出)是解决使用 sudo 时重定向不起作用的问题(此处您可以使用bash -c
或sh -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 开始(ARGV1
,ARGV2
,...)。
您还可以使用允许在此类会话中运行的典型 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 ...