Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 脚本的引用规则-c';命令';_Shell - Fatal编程技术网

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

Shell 脚本的引用规则-c';命令';,shell,Shell,我正在寻找传递给script-c command的命令的引用/拆分规则。手册上说 -c, --command command: Run the command rather than an interactive shell. 但是我想确保“command”被正确转义。command参数只是一个常规字符串,shell将其处理为文件的摘录。我们可能认为-c命令在功能上等同于 printf '%s' COMMAND > /tmp/command_to_execute.sh sh /tmp/c

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

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

但是我想确保“command”被正确转义。

command参数只是一个常规字符串,shell将其处理为文件的摘录。我们可能认为
-c命令
在功能上等同于

printf '%s' COMMAND > /tmp/command_to_execute.sh
sh /tmp/command_to_execute.sh
然而,form
-c命令
优于辅助文件的版本,因为它避免了与使用辅助文件相关的争用条件

-c命令
选项的典型用法中,我们将
命令
作为单引号字符串传递,如以下伪代码示例所示:

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
来构建
命令
字符串,但这可能会很繁琐。举例说明了这种技术 通过这里定义的过于复杂的
grep
-like
命令

% 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.
%AWKSCRIPT='$0~expr{print($0)}'
%COMMAND=$(printf'awk-v expr=“$1”\047%s\047'$AWKSCRIPT”)
%sh-c“$COMMAND”打印匹配“调优”
回想一下,
047
是单引号字符ASCII码的八进制表示


作为旁注,这些构造在Makefiles中非常重要,它们可以在其中替换。

该命令仅由shell运行,正常的引用规则适用。但它也由您正在键入的shell处理,因此您需要遵守其引用规则。但剧本并没有什么特别的规定。它就像
bash-c commmand
。在一行cmd上键入的任何内容都可以用作
-c
的字符串目标。它必须被引用,所以它是一个字符串。这很好,直到您想在内部使用一个外部引用字符,比如
-c'ls-l | awk'{print$9}'
oops。对于这种情况,您可以在外部使用dbl引号,但是
$9
将被解释为shell cmd行arg,因此您必须避开它,例如
-c''ls-l | awk'{print\$9}'
等。您的问题太模糊,无法进一步回答。如果你有不起作用的具体案例,那么将其作为新问题发布。祝你好运。不,事实上这已经够好了,我想出来了,谢谢。