gpt4 book ai didi

bash - 回显传递给带有可见引号的命令的确切命令行

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

所以我可以非常愉快地将命令行构建到 bash 数组中,然后用引号执行它并很好地引用每个参数:

declare -a cmd_args
cmd_args=("-p" "dir path/with spaces")
mkdir "${cmd_args[@]}"
echo dir*/*

但是我怎样才能以一种有意义的方式将其回显到屏幕上 - 即向用户显示他们可以键入的命令,或者我可以将其保存在日志文件中以供将来引用?所有这些看起来(基本上)都一样:

echo runnimg mkdir with arguments ${cmd_args[@]}
echo runnimg mkdir with arguments "${cmd_args[@]}"
echo "runnimg mkdir with arguments '${cmd_args[@]}'"
echo "runnimg mkdir with arguments '${cmd_args[*]}'"

==> runnimg mkdir with arguments '-p dir path/with spaces'

这显然是错误的命令。这并没有向用户显示他们可以键入的命令,或者我可以保存在日志文件中并在将来重现的命令。我想看看:

runnimg mkdir with arguments '"-p" "dir path/with spaces"'

我考虑过使用 cat<<EOF :

cat<<EOF 
"${cmd_args[@]}"
EOF

但实际上,这会在整个参数列表周围生成一个大引号!这里有什么?这怎么可能是我的意图?如果是,那么我有 "${cmd_args[*]}" .

这就是挑战。以用户可以说“是的,这是正确的命令”的方式打印命令。

对那些说“%p\n”的人表示抱歉,虽然这对于日志文件来说可能没问题,但为了重新测试命令而返回并“明确地”格式化它仍然很痛苦,但这并不是真的对于交互式“这是给用户的命令反馈”来说已经足够好了。

也许已经有了答案,但如果是的话,它会被所有“总是引用你的论点”类型的答案淹没。

最佳答案

如果您想打印每个参数都被引用的参数列表,无论引用是否合适:

printf '"%s" ' "${cmd_args[@]}"

如果您只想在需要时打印带引号或转义的参数列表:

printf '%q ' "${cmd_args[@]}"

做你的方式:

printf 'runnimg mkdir with arguments:'
printf ' %q' "${cmd_args[@]}"

dash ksh POSIX shell 兼容实现:

#!/usr/bin/env dash

#cmd_args=("-p" "dir path/with spaces")
# dash and POSIX shell don't have arrays
# but support setting the arguments like this:
set -- -p "dir path/with spaces"
printf 'runnimg mkdir with arguments:'
# dash built-in printf does not know about %q format,
# but system command printf does.
env printf ' %q' "$@"
echo

mkdir "$@"

关于bash - 回显传递给带有可见引号的命令的确切命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57562115/

28 4 0