执行前先写一行,不要写两次

执行前先写一行,不要写两次

我编写了一个带有选项的 bash 脚本--verbose,我想在执行它们之前编写大部分行

xinput --set-prop "$TP" "Device Accel Constant Deceleration" $TOUCHPAD_DECELERATION

我希望得到带有引号的输出,但执行了变量,以便用户可以复制并粘贴该命令以再次执行它。

这将是(如果命令中有很多引号,则越来越复杂)解决方法,将行写入两次:

echo 'xinput --set-prop "'"$TP"'" "Device Accel Constant Deceleration" '"$TOUCHPAD_DECELERATION"
xinput --set-prop "$TP" "Device Accel Constant Deceleration" $TOUCHPAD_DECELERATION

如何用 echo 写出这一行的结果而不必写两次?

答案1

您可以使用该set -x选项。set -x将要:

打印简单命令的痕迹,包括命令、case 命令、选择命令和算术命令及其参数或关联的单词列表在扩展之后和执行之前。 PS4 变量的值被扩展,并且结果值在命令及其扩展参数之前打印。

如果你写:

set -x
var="Hello world"
echo "I say: " $var

那么输出将是:

+ var='Hello world'
+ echo 'I say:' Hello world
I say: Hello world

+的值PS4。要抑制它,请在行PS4=后添加set -x,或通过设置PS4为另一个值来更改它。

set -x也可以通过 启用set -o xtrace。要再次禁用该选项,请使用set +x

如果您只想打印一些命令,您可以在子 shell 中运行它们:

( set -x ; echo "I say: " $var )
+ echo 'I say:' Hello world
I say: Hello world

将命令放在括号中将set -x仅适用于该命令,并在最后自动禁用它。

答案2

我使用一个函数来做这样的事情:

#########################################################
# Function to facilitate printing of commands being run #
#########################################################
runthis(){
    echo "$@" 1>&2
    eval "$@"
}

现在,每当我想在脚本中运行命令时,我都会像这样运行

runthis xinput --set-prop \"$TP\" \"Device Accel Constant Deceleration\" \"$TOUCHPAD_DECELERATION\"

相关内容