首页 > 解决方案 > 如何使用 `$@` 将链式命令作为单个参数执行?

问题描述

$@我有一个最终执行的 bash 文件

$@

它接收链式命令一个参数。

./script.sh "ls && clear"

它执行第一个命令并考虑休息作为它的参数。
我想像通常执行的那样执行所有链接的命令。

标签: bash

解决方案


维护“$@”接口

如果您需要 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"

推荐阅读