gpt4 book ai didi

bash - 不能将 $@ 的所有参数与 sh -c 一起使用

转载 作者:行者123 更新时间:2023-11-29 09:36:01 31 4
gpt4 key购买 nike

在脚本中,我有一个涉及 $@sh -c 命令,但似乎只有 $@ 的第一项被考虑在内:

$ set -- --no-resume-playback https://www.facebook.com/TBN/videos/1580372468665943/
$ echo "$@"
--no-resume-playback https://www.facebook.com/TBN/videos/1580372468665943/
$ sh -c "echo $@"
--no-resume-playback
$ sh -c "echo ${@[*]}"
bash: echo ${@[*]}: bad substitution

编辑 1:如果我将 $@ 数组复制到一个变量中,它会起作用:

$ args=("$@")
$ sh -c "echo ${args[*]}"
--no-resume-playback https://www.facebook.com/TBN/videos/1580372468665943/

如何在 sh -c 调用中使用 $@ 的所有参数?

最佳答案

$@ 扩展为单独的词,即使它在双引号中并且看起来像一个词。您编写的命令扩展为:

sh -c "echo --no-resume-playback" https://www.facebook.com/TBN/videos/1580372468665943/

运行的命令是 echo --no-resume-playback,其中 $0 设置为 Facebook URL。 echo --no-resume-playback 不使用 $0,因此它实际上被丢弃了。

${@[*]} 你的想法是正确的。碰巧的是,$@ 是一种具有独特语法的特例:您需要 $*,它可以扩展为单个单词。

sh -c "echo $*"

这有点危险,因为任何带有像 * 这样的通配符的参数都可能被扩展。如果你想安全起见,你需要这个更复杂的版本:

sh -c 'echo "$@"' sh "$@"

这会将 "$@" 作为参数转发给 -c 命令,这样我们就可以在里面使用 "$@"。请注意,我现在已切换到单引号:我们希望子外壳扩展 "$@",而不是外壳。

实际上,对于最大的迂腐来说,echo 也不是完全安全的。如果您尝试打印像 -n 这样的字符串,它可能不会按字面打印,而是被解释为一个选项。最安全的选择是使用 printf:

sh -c 'printf "%s\n" "$*"' sh "$@"

关于bash - 不能将 $@ 的所有参数与 sh -c 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55579579/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com