Passando parâmetros para python -c dentro de uma função bash?

Passando parâmetros para python -c dentro de uma função bash?

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_MODULEpara 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 fooem 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'".

informação relacionada