如何在不对其参数进行变量扩展的情况下回显脚本调用

How to echo script invocation without variable expansion of its args

在 bash 脚本中,我想回显脚本调用 而无需 扩展作为参数传递的变量。

回显脚本调用扩展变量可以用

实现
echo "${BASH_SOURCE[0]} ${*}"

使用

回显(脚本或任何其他命令的)历史
echo "$(tail -n 1 ~/.bash_history)"

根据需要显示不带变量扩展的脚本调用,但不适用于 运行 脚本(仅适用于已完成的脚本)。

如何在 运行 脚本中回显脚本调用而不对其参数进行变量扩展?

如果您可以使用 bash -c script args 执行您的脚本,您想要的可以使用 BASH_EXECUTION_STRING 变量来实现:

$ bash -c 'echo "$BASH_EXECUTION_STRING"'
echo "$BASH_EXECUTION_STRING"

这个输出不容易理解,但是你可以看到 echo 命令在执行时打印了未展开的命令。这是因为 BASH_EXECUTION_STRING 变量的值是文字:echo "$BASH_EXECUTION_STRING".

因此,如果您的脚本是,例如:

#!/usr/bin/env bash

script="[=11=]"
cmd=""
shift

echo "script name: $script"
echo "command line: $cmd"
echo "parameter: "

你可以这样执行:

$ a=42 bash -c './foo.sh "$BASH_EXECUTION_STRING" "$a"'
script name: ./foo.sh
command line: ./foo.sh "$BASH_EXECUTION_STRING" "$a"
parameter: 42