Passar argumentos com aspas duplas de um script bash para outro

1

Um script bash é chamado assim:

$./script 25 "str1 str2"

e é suposto para iniciar um terminal, que executa outro script que recebe os dois argumentos, exatamente como estão acima (incluindo aspas). Eu tentei isso:

lxterminal --command=$"./script2 "$"$@"

mas isto parece omitir as aspas, pelo que a chamada terminaria em ./script2 25 str1 str2 . Qual é a notação correta para replicar os argumentos como estavam na linha de comando original?

    
por nightcod3r 04.02.2017 / 22:22

1 resposta

4

O problema é que o argumento para lxterminal ' --command é apenas uma string, não pode ter um comando e seus argumentos como alguns outros terminais como xterm do.

lxterminal analisa essa cadeia usando suas próprias regras para determinar o comando para executar seus argumentos. Isso é semelhante, mas não é idêntico à análise de shell Bourne.

Ele reconhece '...' como aspas strongs e espaço como separador de argumentos, então você pode implementar citações para ele como:

lxquote() {
  awk -v q="'" '
    function lxquote(s) {
      gsub(q, q "\" q q, s)
      return q s q
    }
    BEGIN {
      for (i = 1; i < ARGC; i++) {
        printf sep "%s", lxquote(ARGV[i])
        sep = " "
      }
    }' "$@"
}

E chame lxterminal como:

lxterminal --command="$(lxquote ./script2 "$@")"

Como alternativa, se o intérprete script for bash , você poderá fazer:

printf -v code '%q ' ./script2 "$@"
CODE=$code lxterminal --command="bash -c 'eval \"\$CODE\"'"
    
por 05.02.2017 / 02:46