脚本-c'命令'的引用规则

时间:2014-06-02 20:38:38

标签: shell

我正在寻找传递给script -c command的命令的引用/拆分规则。手册页只是说

-c, --command command: Run the command rather than an interactive shell.

但我想确保"命令"被妥善逃脱。

1 个答案:

答案 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