在执行之前写一行而不写两次

rub*_*o77 4 bash

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

xinput --set-prop "$TP" "Device Accel Constant Deceleration" $TOUCHPAD_DECELERATION
Run Code Online (Sandbox Code Playgroud)

我希望输出带有引号但变量被执行,因此用户可以复制并粘贴该命令以再次执行它。

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

echo 'xinput --set-prop "'"$TP"'" "Device Accel Constant Deceleration" '"$TOUCHPAD_DECELERATION"
xinput --set-prop "$TP" "Device Accel Constant Deceleration" $TOUCHPAD_DECELERATION
Run Code Online (Sandbox Code Playgroud)

如何在不必写两次的情况下用 echo 写出这一行的结果?

Mic*_*mer 8

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

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

如果你写:

set -x
var="Hello world"
echo "I say: " $var
Run Code Online (Sandbox Code Playgroud)

那么输出将是:

set -x
var="Hello world"
echo "I say: " $var
Run Code Online (Sandbox Code Playgroud)

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

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

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

+ var='Hello world'
+ echo 'I say:' Hello world
I say: Hello world
Run Code Online (Sandbox Code Playgroud)

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