我正在寻找传递给script -c command
的命令的引用/拆分规则。手册页只是说
-c, --command command: Run the command rather than an interactive shell.
但我想确保"命令"被妥善逃脱。
答案 0 :(得分:0)
COMMAND
参数只是一个由shell处理的常规字符串,就好像它是文件的摘录一样。我们可能会认为-c COMMAND
在功能上等同于
printf '%s' COMMAND > /tmp/command_to_execute.sh
sh /tmp/command_to_execute.sh
格式-c COMMAND
优于辅助文件的版本,因为它避免了与使用辅助文件相关的竞争条件。
在-c COMMAND
选项的典型用法中,我们将COMMAND
作为单引号字符串传递,如此伪代码示例中所示:
sh -c '
do_some_complicated_tests "$1" "$2";
if something; then
proceed_this_way "$1" "$2";
else
proceed_that_way "$1" "$2";
fi' ARGV0 ARGV1 ARGV2
如果命令必须包含单引号字符串,我们可以依靠printf
来构建COMMAND
字符串,但这可能很乏味。示出了该技术的示例
由过于复杂的grep
- 如此处定义的COMMAND
:
% AWKSCRIPT='$0 ~ expr {print($0)}'
% COMMAND=$(printf 'awk -v expr="$1" \047%s\047' "$AWKSCRIPT")
% sh -c "$COMMAND" print_matching 'tuning' < /usr/share/games/fortune/freebsd-tips
"man tuning" gives some tips how to tune performance of your FreeBSD system.
回想一下,047
是单引号字符的ASCII代码的八进制表示。
作为旁注,这些结构在Makefile中非常有用,它们可以替换shell functions。