何时使用带选项-c的bash?

时间:2016-10-06 19:16:49

标签: bash

我正在尝试更好地理解bash的-c选项。该手册页说:

  

-c:如果存在-c选项,则从第一个非选项参数command_string中读取命令。如果在command_string之后有参数,则将它们分配给位置参数,从$ 0开始。

我无法理解这意味着什么。

如果我使用和不使用bash -c执行以下命令,我会得到相同的结果(来自http://www.tldp.org/LDP/abs/html/abs-guide.html的示例):

$ set w x y z; IFS=":-;"; echo "$*"
w:x:y:z
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z

3 个答案:

答案 0 :(得分:3)

你已经在运行bash 时,

bash -c并不那么有趣。另一方面,考虑从Python脚本运行bash代码的情况:

#!/usr/bin/env python
import subprocess
fileOne='hello'
fileTwo='world'

p = subprocess.Popen(['bash', '-c', 'diff <(sort "$1") <(sort "$2")',
                      '_',     # this is $0 inside the bash script above
                      fileOne, # this is $1
                      fileTwo, # and this is $2
                     ])
print p.communicate() # run that bash interpreter, and print its stdout and stderr

在这里,因为我们使用的是仅使用bash的语法(<(...)),所以默认情况下你不能运行任何使用POSIX sh的东西,subprocess.Popen(..., shell=True)就是这种情况。因此,使用bash -c可以访问在没有自己玩FIFO的情况下无法使用的功能。

顺便说一下,这不是唯一的方法:也可以使用bash -s,并在stdin上传递代码。下面,这不是来自Python而是POSIX sh(/bin/sh,同样不能保证<(...)可用):

#!/bin/sh

# ...this is POSIX sh code, not bash code; you can't use <() here
# ...so, if we want to do that, one way is as follows:

fileOne=hello
fileTwo=world

bash -s "$fileOne" "$fileTwo" <<'EOF'
# the inside of this heredoc is bash code, not POSIX sh code
diff <(sort "$1") <(sort "$2")
EOF

答案 1 :(得分:1)

如何从BASH shell外的执行BASH代码

答案是,使用-c选项,使BASH执行作为-c参数传递的任何内容。

所以,是的,这个选项的目的是任意执行BASH代码,但只是以另一种方式。

答案 2 :(得分:1)

-c选项在其他程序启动bash时找到最重要的用途,特别是当要执行的代码可能或确实包含重定向,管道,shell内置函数,shell变量时作业和/或非平凡的列表。在/bin/shbash的别名的POSIX系统上,它专门支持C库的system()函数。

在不使用-c的情况下,在fork / exec之上实现等效行为要复杂得多,但并非完全不可能。