我有一个bash文件,该文件最后执行$@
$@
并且它接收链接命令的单个参数。
./script.sh "ls && clear"
它执行第一个命令并考虑休息作为参数。
我想按正常执行所有链接的命令。
答案 0 :(得分:3)
如果要使用Shell语法(复合命令,重定向等),则需要调用Shell。因此:
./script.sh bash -c 'ls && clear'
...您还需要将$@
更改为"$@"
(不带引号的$@
与-完全相同,这意味着-拥有所有{ 1}})。
如果您要传递数据,请在代码中附加带外参数以避免安全性错误:
$*
与其他方法不同,这仍然可以使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 "$*"
一样,会丢弃这些参数之间的区别,而bash -c "$*"
会默默忽略第一个参数之后的参数,除非第一个参数是在了解调用约定的情况下编写的。
要仅接受一个参数并将其解析为代码,请使用:
bash -c "$@"
要仅将第一个参数作为代码接受,并在该代码的上下文中将后续参数保留为eval "$1"
,$1
等,请使用:
$2
答案 1 :(得分:1)
您可以在sh文件上使用以下命令:
#!/usr/bin/env bash
bash -c "$@"