我有一个 bash 文件,它最后执行 $@
$@
它接收链式命令的单个参数。
./script.sh "ls && clear"
它执行第一个命令并考虑休息作为它的参数。
我想像正常执行一样执行所有链接的命令。
最佳答案
维护“$@”接口(interface)
如果您需要 shell 语法(复合命令、重定向等),则需要调用 shell。因此:
./script.sh bash -c 'ls && clear'
...您还需要将 $@
更改为 "$@"
(不带引号,$@
完全相同as -- 意思是,具有 -- $*
) 的所有错误。
如果您想传递数据,请使用代码中的带外额外参数来传递数据,以避免安全错误:
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"
工作。
仅接受一个参数
使用“$@”
向用户 promise 将处理多个参数;但是,eval "$*"
与 bash -c "$*"
一样,会忽略这些参数之间的区别,而 bash -c "$@"
code> 默默地忽略第一个参数之后的参数,除非第一个参数是在了解该调用约定的情况下编写的。
要仅接受一个参数并将其解析为代码,请使用:
eval "$1"
要仅接受第一个参数作为代码,并在该代码的上下文中将后续参数保留为 $1
、$2
等,请使用:
code=$1; shift; eval "$code"
关于bash - 如何使用 `$@` 作为单个参数执行链式命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52741567/