我正在尝试更好地理解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
答案 0 :(得分:3)
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/sh
为bash
的别名的POSIX系统上,它专门支持C库的system()
函数。
在不使用-c
的情况下,在fork / exec之上实现等效行为要复杂得多,但并非完全不可能。