Shell 正确地引用args来调用su-c

Shell 正确地引用args来调用su-c,shell,su,Shell,Su,su-c接受单个字符串参数,该参数被传递到$SHELL-c。这使得手动运行更复杂的命令成为引用的噩梦。我想要的是:一个将“$@”转换为一个字符串的函数,该字符串由目标shell适当地解析。为了简单起见,让我们假设目标shell与当前shell相同,或者是一个简单的(b)shell 我知道sudo将以正确的方式完成此任务。但我不想依赖sudo,除非我们必须这样做 # This does the right thing run_sudo() { sudo -u targetuser "$@"

su-c
接受单个字符串参数,该参数被传递到
$SHELL-c
。这使得手动运行更复杂的命令成为引用的噩梦。我想要的是:一个将
“$@”
转换为一个字符串的函数,该字符串由目标shell适当地解析。为了简单起见,让我们假设目标shell与当前shell相同,或者是一个简单的(b)shell

我知道
sudo
将以正确的方式完成此任务。但我不想依赖sudo,除非我们必须这样做

# This does the right thing
run_sudo() {
    sudo -u targetuser "$@"
}
run_sudo echo "double  spaces"

如果您可以假设bash,那么它很简单:

/bin/bash -c "$(printf "%q " "$@")"
对于POSIX sh:

quote() {
  for arg
  do
    var=$(printf "%sx" "$arg" | sed -e "s/'/'\\\\''/")
    var=${var%x}
    printf "'%s' " "$var"
  done
}
/bin/sh -c "$(quote "$@")"
quote() {
  for arg
  do
    var=$(printf "%sx" "$arg" | sed -e "s/'/'\\\\''/")
    var=${var%x}
    printf "'%s' " "$var"
  done
}
/bin/sh -c "$(quote "$@")"