AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 409703
Accepted
David Lambauer
David Lambauer
Asked: 2017-12-09 02:46:21 +0800 CST2017-12-09 02:46:21 +0800 CST 2017-12-09 02:46:21 +0800 CST

Bash - O parâmetro não deve ser analisado como bash durante a saída

  • 772

Eu tenho 2 scripts Shell. O primeiro aciona o segundo e adiciona alguns parâmetros. O segundo chama um comando e adiciona os parâmetros do primeiro script como parâmetros para o comando.

O primeiro parece algo como:

#!/usr/bin/env bash

ADDITIONAL_ARGUMENTS='--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'

SUPER_PARAMS=${ADDITIONAL_ARGUMENTS} my_second_script.sh

Então, o segundo script faz algo como:

#!/usr/bin/env bash

randomBinary --some-hardcoded-parameters \
             "${SUPER_PARAMS}"

O que eu esperaria ter é uma saída de:

randomBinary --some-hardcoded-parameters --set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"

Mas, em vez disso, a chamada se parece com:

randomBinary --some-hardcoded-parameters '--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'

Tentei 2 dias citando o parâmetro corretamente, mas sem resultados.

bash quoting
  • 2 2 respostas
  • 49 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-09T05:37:28+08:002017-12-09T05:37:28+08:00

    Para armazenar vários argumentos, use uma matriz, não uma variável escalar.

    additional_arguments=(
      --set
      'args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}'
    )
    randomBinary --some-hardcoded-parameters "${additional_arguments[@]}"
    

    Observe que, como as variáveis ​​de ambiente são sequências de bytes não NUL, você precisa de alguma codificação se quiser passar uma definição de array para outro comando por meio do ambiente.

    Com ksh, bash, zshou yashvocê pode usar:

    ARRAY_DEFINITION="$(typeset -p additional_arguments)" my_second_script.sh
    

    para exportar a definição de array em uma variável de ambiente no script de chamada.

    E eval "$ARRAY_DEFINITION"no script chamado para importar essa definição de array.

    Observe que é importante que o código seja avaliado na mesma localidade e com o mesmo shell em que foi gerado.

    Observe também que, se a definição de array for avaliada dentro de uma função, o array será local para a função.

    Alguns shells como rc, esou fishpermitem exportar matrizes (usando sua própria codificação internamente).

    Aqui, seria mais fácil passar as informações como argumentos para o script chamado, já que é um array.

    No script de chamada:

    my_second_script.sh "${additional_arguments[@]}"
    

    No script chamado:

    randomBinary --some-hardcoded-parameters "$@"
    

    Ou chame o script chamado com .para que ele compartilhe as variáveis ​​de shell do chamador para que você não precise usar o ambiente para passar esses dados em uma execução.

    • 3
  2. ilkkachu
    2017-12-09T05:37:31+08:002017-12-09T05:37:31+08:00

    Aqui,

    randomBinary --some-hardcoded-parameters "${SUPER_PARAMS}"
    

    SUPER_PARAMScontém --set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}", e como está entre aspas, é passado como está. Se não estivesse entre aspas, seria dividido em espaço em branco para as cinco strings --set, "args={/bin/bash,-c,cd, /var/www, &&, sudo -u www-data bash scripts/system/update.sh}", e essas seriam passadas como argumentos.

    Parece que você deseja que as aspas dentro da variável também sejam interpretadas, e isso requer a adição de outra camada de análise de shell, com evalou executando a coisa atravésbash -c '...'

    O script de teste aqui:

    $ cat test.sh
    #!/bin/bash    
    ARGS='--set "args={this, that && that}"'
    ./args.sh $ARGS
    eval "./args.sh $ARGS"
    

    estampas:

    <!-- language: lang-none -->
    $ bash test.sh
    5 args: <--set> <"args={this,> <that> <&&> <that}"> 
    2 args: <--set> <args={this, that && that}> 
    

    (O script args.shimprime o número é o número de argumentos distintos e os próprios argumentos são impressos dentro de <...>)

    Observe que o evalexecutará, por exemplo, quaisquer substituições de comando, portanto, abre a execução de código arbitrário. Normalmente, seria melhor manter os argumentos em uma matriz de shell , mas aqui você os está passando de um script para outro, então isso não funciona muito bem. Consulte a seção "Como armazeno um comando em uma variável?" nesta resposta sobre como lidar com espaços em branco .

    Também Word Splitting in the Bash Guide , e você também pode usar set -xpara ver quais comandos o shell realmente executa.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve