sh - sh 调用中的额外参数会发生什么?
问题描述
如果我运行,sh -c "prog arg1 arg2 arg3"
那么 prog 将使用传递给它的参数运行。这很简单。如果我错过了引号,sh -c prog arg1 arg2 arg3
那么 prog 将在没有参数的情况下运行。但是争论会发生什么?sh 只是默默地忽略它们,还是它们提供某些功能?手册页(在我看来)有点不清楚
-c 字符串
如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。
据我所知,“字符串后的参数”没有分配给位置参数。
解决方案
额外的参数确实分配给了位置参数。$1
,$2
等在正在执行的命令中可用。
$ sh -c 'echo "0=$0; 1=$1; 2=$2"' foo bar baz
0=foo; 1=bar; 2=baz
如果您希望将它们传递给prog
,则必须编写如下内容:
sh -c 'prog "$1" "$2" "$3"' sh arg1 arg2 arg3
或者,更一般地说:
sh -c 'prog "$@"' sh arg1 arg2 arg3
(请注意,我已将参数列表添加sh
到参数列表中,以确保$0
设置为 shell 的名称而不是arg1
.)
推荐阅读
- python - 将 API 响应附加到单个 JSON 文件
- logging - 登录 Netlogo 网站
- python - 仅当存在一个具有空值的后续行时,才在数据框中前向填充一列
- c# - 当某些 LogicalThreadContext.Property 在 log4net 中具有特定值时如何忽略日志
- c# - asp.net core 2.2 razor 页面登录不持久。很快用户必须重新登录
- android - 任务 ':expo-constants:compileDebugJavaWithJavac' 执行失败。(反应原生)
- angular - 更改 Angular 7 中的 webpack 配置并更改 CKEditor 5 的 SVG 设置以加载自定义插件
- c++ - 是否可以仅通过在 C++ 中存储分配的指针地址来分析内存?
- spring - 无法使用 Spring Security 加载静态资源
- c - 使用 void* 分配结构