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

3

Eu 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 eu pensei em enrolar a coisa toda dentro de uma função bash que eu poderia chamar, pyt -c [...]

Eu usei $@ com sucesso no passado em situações semelhantes, então eu esperava que isso ajudasse aqui também. Mas não está funcionando como eu tenho configurado 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 testá-lo, "foo" não será impresso. Uma linha em branco é. python -c "print 'foo'" imprime corretamente, então tem algo a ver com a minha função aqui.

Se eu colocar echo $@ dentro da função, todos os parâmetros serão impressos bem. O intérprete do Python também não foi iniciado (é apenas se eu digito pyt ), então o parâmetro -c parece estar com algum efeito algum - nada é impresso.

O que estou perdendo?

    
por JK Laiho 29.11.2013 / 15:58

1 resposta

2

Você está entendendo mal como os argumentos são passados.

Quando você executa python -c "print 'foo'" , o shell o analisa em

  • python
  • -c
  • print 'foo'

para que o python acabe vendo dois argumentos.

Quando você executa pyt -c "print 'foo'" , a linha python $@ é expandida para (o equivalente a) python -c print 'foo' , que é tokenizada como

  • python
  • -c
  • print
  • foo

i.e. O 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 $@ use "$@" (deve ser 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'" .

    
por 29.11.2013 / 16:49