La soluzione
Ecco il mio approccio: analizzare il MYS file di bash linee di assegnazione elfo e il processo di variabili solo come ad esempio:
FOO="/path/to/foo"
Ecco il codice:
import shlex
def parse_shell_var(line):
"""
Parse such lines as:
FOO="My variable foo"
:return: a tuple of var name and var value, such as
('FOO', 'My variable foo')
"""
return shlex.split(line, posix=True)[0].split('=', 1)
if __name__ == '__main__':
with open('shell_vars.sh') as f:
shell_vars = dict(parse_shell_var(line) for line in f if '=' in line)
print(shell_vars)
Come Funziona
Date un'occhiata a questo frammento:
shell_vars = dict(parse_shell_var(line) for line in f if '=' in line)
Questa riga scorre le righe nello script della shell, elabora solo quelle linee che hanno il segno di uguale (non un foo l-proof modo per rilevare l'assegnazione variabile, ma il più semplice). Quindi, esegui quelle linee nella funzione parse_shell_var
che utilizza shlex.split
per gestire correttamente le virgolette (o la loro mancanza). Infine, i pezzi sono assemblati in un dizionario. L'output di questo script è:
{'MOO': '/dont/have/a/cow', 'FOO': 'my variable foo', 'BAR': 'My variable bar'}
Ecco il contenuto della shell_vars.sh:
FOO='my variable foo'
BAR="My variable bar"
MOO=/dont/have/a/cow
echo $FOO
Discussione
Questo approccio ha un paio di vantaggi:
- Non esegue il guscio (sia in bash o in Python), che evita qualsiasi effetto collaterale
- Di conseguenza, è sicuro da utilizzare, anche se l'origine dello script della shell è sconosciuta
- Gestisce correttamente i valori con o senza quot es
Questo approccio non è perfetto, ha alcune limitazioni:
fonte
2016-05-01 20:53:36
bel lavoro svolta una risposta senza senso in quella giusta. – dbliss
Ovviamente questa è una pessima idea, a meno che non si abbia il controllo completo sui dati di input (nel qual caso, provaci, suppongo). – larsks
Non è una cattiva risposta (è * permesso *) ma i soliti avvertimenti dovrebbero essere lì. – Harlin