escreve uma linha antes de ser executada sem escrever duas vezes

4

Eu escrevo um script bash com uma opção --verbose , onde quero escrever a maioria das linhas antes de executá-las

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

Eu gostaria de ter exatamente essa saída com aspas, mas as variáveis são executadas, para que o usuário possa copiar e colar esse comando para executá-lo novamente.

Esta seria a solução (mais e mais complicada, se houver muitas citações no comando) para escrever a linha duas vezes:

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

Como posso escrever o resultado dessa linha com o eco sem ter que escrever duas vezes?

    
por rubo77 04.07.2014 / 11:45

2 respostas

8

Você pode usar a opção set -x . set -x :

Print a trace of simple commands, for commands, case commands, select commands, and arithmetic for commands and their arguments or associated word lists after they are expanded and before they are executed. The value of the PS4 variable is expanded and the resultant value is printed before the command and its expanded arguments.

Se você escrever:

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

a saída será:

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

O + é o valor de PS4 . Para suprimi-lo, adicione PS4= após sua linha set -x ou altere-o definindo PS4 para outro valor.

set -x também pode ser ativado com set -o xtrace . Para desativar a opção novamente, use set +x .

Se houver apenas alguns comandos que você deseja imprimir, você pode executá-los em um subshell:

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

Colocar o comando entre parênteses aplicará set -x apenas para este comando e desativá-lo automaticamente no final.

    
por 04.07.2014 / 11:54
2

Eu uso uma função para coisas como esta:

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

Agora, sempre que eu quero executar um comando no meu script, eu o executo assim

runthis xinput --set-prop \"$TP\" \"Device Accel Constant Deceleration\" \"$TOUCHPAD_DECELERATION\"
    
por 04.07.2014 / 12:04

Tags