bash - Aspas simples adicionadas às aspas duplas [closed]

1
Eu estou escrevendo um script para executar um determinado programa em um simulador, alterando o argumento fornecido e estou tendo um problema onde o bash continua inserindo ticks simples em torno das aspas duplas que faz o simulador falhar espetacularmente. Como posso impedir que isso aconteça?

Script

#!/bin/bash
#./matrix_sim MM1.x86 1024 X86 gem5.opt

PROGRAM=$1
ARGUMENT=$2
ARCHI=$3
TARGET=$4

./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o \"$ARGUMENT\"

Quando executo esse script, o que realmente é produzido é

./gem5/build/X86/gem5.opt gem5/configs/example/se.py -c ./MM1.x86 -o '"2"'

Mas o que eu realmente quero que aconteça é isso

./gem5/build/X86/gem5.opt gem5/configs/example/se.py -c ./MM1.x86 -o "2"

Como faço para me livrar dos ticks únicos na saída?

    
por Nubcake 06.02.2017 / 18:39

3 respostas

2

O Bash não adiciona aspas simples à sua string. As aspas simples são como torna a saída do rastreio set -x visualmente não ambígua. No bash, set -x produz resultados visualmente não ambíguos, colocando aspas simples em torno de cadeias de caracteres que contêm caracteres especiais de shell (espaço em branco e !"#$&\()*;<>?[\]^'{|}~ ). Aqui, você está rastreando um comando que recebe um parâmetro contendo " , então o bash imprime com aspas simples em torno dele para deixar claro que " é um caractere literal na string e não é algo na shell sintaxe de origem.

Parece que você não queria ter um aspas duplas no argumento. Então não coloque um.

Você precisa de aspas duplas em torno de expansões de variáveis, mas são aspas duplas, na sintaxe do shell, não colocando uma aspa dupla entre aspas, de forma que um aspas duplas acabem na string.

"./gem5/build/$ARCHI/$TARGET" gem5/configs/example/se.py -c "./$PROGRAM" -o "$ARGUMENT"
    
por 07.02.2017 / 01:18
1

Use apenas "$ARGUMENT" :

./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o "$ARGUMENT"

O Bash adicionará aspas simples (por exemplo, a saída do rastreio set -x ) quando você usar \"$ARGUMENT\" porque você está fazendo a parte das aspas duplas do valor do argumento (é mais provável que não o que você quer).

    
por 06.02.2017 / 18:49
0

Não é possível replicar:

$ ./in.sh program arg arch target
./gem5/build/arch/target gem5/configs/example/se.py -c ./program -o "arg"
$ cat in.sh
#!/bin/bash
#./matrix_sim MM1.x86 1024 X86 gem5.opt

PROGRAM=$1
ARGUMENT=$2
ARCHI=$3
TARGET=$4

echo ./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o \"$ARGUMENT\"

Eu tentei muitas manipulações para tentar replicar o que você está vendo e sou incapaz de fazer isso.

Você talvez possa tentar:

ARGUMENT="\"$2\""

e, em seguida, remover as aspas com escape em torno da sua invocação:

echo ./gem5/build/$ARCHI/$TARGET gem5/configs/example/se.py -c ./$PROGRAM -o "$ARGUMENT"
    
por 06.02.2017 / 18:46