bash - 如何使用 `$@` 将链式命令作为单个参数执行?
问题描述
$@
我有一个最终执行的 bash 文件
$@
它接收链式命令一个参数。
./script.sh "ls && clear"
它执行第一个命令并考虑休息作为它的参数。
我想像通常执行的那样执行所有链接的命令。
解决方案
维护“$@”接口
如果您需要 shell 语法(复合命令、重定向等),则需要调用 shell。因此:
./script.sh bash -c 'ls && clear'
...您还需要更改$@
为"$@"
(未引用,$@
与 -- 含义完全相同,具有 -- 的所有错误$*
)。
如果要传递数据,请使用代码中的带外额外参数来避免安全错误:
dir=/tmp # but unlike eval, this is still safe with *any* directory name
./script.sh bash -c 'ls "$1" && clear' _ "$dir"
与其他一些方法不同,这仍然可以./script.sh printf '%s\n' "first line" "second line"
工作。
只接受一个论点
"$@"
向用户承诺将处理多个参数;但是,eval "$*"
,like bash -c "$*"
,丢弃这些参数之间的区别,而bash -c "$@"
默默地忽略第一个参数之后的参数,除非第一个参数是在知道该调用约定的情况下编写的。
要仅接受一个参数并将其解析为代码,请使用:
eval "$1"
要仅接受第一个参数作为代码,并在该代码的上下文中将后续参数保留为 、 等,请使用$1
:$2
code=$1; shift; eval "$code"
推荐阅读
- maximo-anywhere - Windows 文件系统上的 TPK 位置
- javascript - 以 Angular 5 滚动到班级
- typescript - 是否会有 Typescript 的“mixin”关键字?
- python - 尝试使用 python API 在测试网上发行代币 - Neblio
- ios - 使用另一个视图控制器(带有表格视图)来显示 UISearchController 的结果
- api - 瑞安航空的 API 限制
- git - 在 Git 选项卡中禁用远程分支 - 完成建议
- django - Django 中间件 TypeError: object() 没有参数
- mpeg-dash - 什么是一 .mpd 文件?
- netlogo - `let` 变量的域进入 `ask`