オプションを含むbashスクリプトを書いており、--verbose
実行する前にほとんどの行を作成したいと思います。
xinput --set-prop "$TP" "Device Accel Constant Deceleration" $TOUCHPAD_DECELERATION
引用符を含む出力を取得したいが、変数を使用して実行すると、ユーザーはコマンドをコピーして貼り付けて再実行できます。
これは(コマンドに引用符が多ければますます複雑になる)解決策で、行を2回作成します。
echo 'xinput --set-prop "'"$TP"'" "Device Accel Constant Deceleration" '"$TOUCHPAD_DECELERATION"
xinput --set-prop "$TP" "Device Accel Constant Deceleration" $TOUCHPAD_DECELERATION
この行の結果を2回書かずにechoを使ってどのように書くことができますか?
答え1
このオプションを使用できますset -x
。set -x
〜する:
コマンド、大/小文字コマンド、選択コマンド、および算術コマンドを含む単純なコマンドのトレース、およびその引数または拡張後および実行前に関連する単語のリストを印刷します。 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
。
一部のコマンドのみを印刷するには、サブシェルで実行できます。
( 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\"