
Preciso imprimir o valor de uma configuração do Django enquanto estiver em um shell Bash.
Basicamente, o comando que gostaria de executar é python -c 'from django.conf import settings; print settings.MEDIA_ROOT'
. Eu preciso estar em um determinado caminho e passar DJANGO_SETTINGS_MODULE
para ele, então pensei em agrupar tudo dentro de uma função bash que eu poderia chamar,pyt -c [...]
Já usei $@
com sucesso em situações semelhantes, então esperava que ajudasse aqui também. Mas não está funcionando porque eu configurei agora.
function pyt {
cd $PROJECT_ROOT # set elsewhere, parent dir of my_site
DJANGO_SETTINGS_MODULE=my_site.settings python $@
cd $OLDPWD
}
Se eu digitar pyt -c "print 'foo'"
para testar, "foo" não será impresso. Uma linha em branco é. python -c "print 'foo'"
imprime corretamente, então tem algo a ver com minha função aqui.
Se eu colocar echo $@
dentro da função, todos os parâmetros serão impressos perfeitamente. O interpretador Python também não foi iniciado (se eu apenas digitar pyt
), então o parâmetro -c parece estar tendoalgunsefeito - nada simplesmente é impresso.
o que estou perdendo?
Responder1
Você está entendendo mal como os argumentos são transmitidos.
Quando você executa python -c "print 'foo'"
o shell analisa-o em
python
-c
print 'foo'
então python acaba vendo dois argumentos.
Quando você executa, pyt -c "print 'foo'"
a linha python $@
é expandida para (o equivalente a) python -c print 'foo'
, que é tokenizado como
python
-c
print
foo
ou seja, python vê três argumentos e executará o comando print
, com a string foo
em sys.argv[1]
.
O que você precisa fazer é usar um token de shell mágico: em vez de apenas $@
usar "$@"
(devem estar entre aspas duplas). Isso diz ao shell para manter os argumentos juntos; quando você executa pyt -c "print 'foo'"
, a linha python "$@"
é expandida para (o equivalente a) python -c "print 'foo'"
.