Answers:
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 -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
的-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"
sh -c
产生(在Ubuntu中)的非登录,非交互会话。sh
dash
将在该壳会话中运行的命令下文中,将被当作参数(位置参数)0( ARGV0
),以及作为参数到该命令(的剩余部分ARGV0
),从1开始(ARGV1
,ARGV2
,...)。
您还可以使用允许在此类会话中运行的典型外壳功能,例如;
,使用多个命令进行命令分隔,使用进行命令分组,使用{}
生成另一个子外壳()
,等等。这些用法的使用可能会稍微改变前面提到的参数定义/示例。
只是要注意,特定于功能的交互式壳仅(默认),例如历史扩展,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 ...
sh -c
?如果它演示的-c
部分中提到的位置参数的分配,那就更好了man sh
。