Por que o eval não está funcionando com a substituição de comandos? [fechadas]

1

Eu tenho este comando

$("${DIR}/test.py" "$1")

cuja saída é

export SOME_VAR="hello world"
export ANOTHER_VAR="hello"

Mas eval $("${DIR}/test.py" "$1")

parece não fazer nada. O que estou fazendo de errado?

Eu quero exportar essas variáveis no meu script de shell.

Script completo de bash:

#!/bin/bash     
DIR="$(cd 'dirname $0' && pwd)" 
eval $("${DIR}/test.py" "$2") 
exit $? 

Script Python (não script completo, mas uma boa ideia):

#!/usr/local/bin/python3 
print('export var1="{0}"\nexport var2="{1}"\nexport var3="{2}"\nexport var4="{2}"'.format(string1, string2, string3))
    
por masterpiece 18.11.2018 / 19:16

2 respostas

2

O exemplo dado também funciona para mim, mas há uma fonte potencial de problemas: dependendo dos valores que estão sendo definidos, você pode precisar de aspas duplas em torno da substituição de comando para evitar a divisão de palavras e a expansão de caracteres curinga:

eval "$("${DIR}/test.py" "$1")"

Observe que, no mínimo, não ter aspas duplas causará problemas se a saída contiver vários comandos separados por novas linhas. Isso ocorre porque, sem as aspas duplas, a saída é dividida em "palavras" com base no espaço em branco (geralmente espaços, tabulações e novas linhas) e, em seguida, eval as une novamente com espaços. Resultado líquido: todas as novas linhas são convertidas em espaços e, portanto, todos os comandos que supostamente são linhas separadas são reunidos em uma única e longa confusão de comandos.

Para um exemplo extremo, suponha que o test.py mostre isto:

# Define some variables:
export SOME_VAR="6 * 5"

O processo de mesclagem dividir-expandir fornece este comando resultante:

# Define some variables: export SOME_VAR="6 file1.txt file2.txt otherfile.png 5"

(onde "file1.txt file2.txt otherfile.png" são todos os arquivos no diretório atual.) Isso não é o que você quer de maneira alguma.

    
por 18.11.2018 / 20:05
1

O problema não estava usando source para permitir a exportação de vars para o shell atual.

    
por 18.11.2018 / 23:20