¿Pasar parámetros a python -c dentro de una función bash?

3

Necesito imprimir el valor de una configuración de Django mientras estoy en un shell Bash.

Básicamente, el comando que me gustaría ejecutar es python -c 'from django.conf import settings; print settings.MEDIA_ROOT'. Sin DJANGO_SETTINGS_MODULEembargo, necesito estar en un cierto camino y pasarlo , así que pensé en envolver todo dentro de una función bash que podría llamar en su lugar,pyt -c [...]

Lo he usado con $@éxito en el pasado en situaciones similares, así que esperaba que también ayudara aquí. Pero no funciona ya que lo tengo configurado en este momento.

function pyt {
    cd $PROJECT_ROOT # set elsewhere, parent dir of my_site
    DJANGO_SETTINGS_MODULE=my_site.settings python $@
    cd $OLDPWD
}

Si escribo pyt -c "print 'foo'"para probarlo, "foo" no se imprime. Una línea en blanco es. python -c "print 'foo'"lo imprime correctamente, por lo que tiene algo que ver con mi función aquí.

Si pongo echo $@dentro de la función, todos los parámetros se imprimen bien. El intérprete de Python tampoco se inicia (lo es si solo escribo pyt), por lo que el parámetro -c parece tener algún efecto, nada se imprime.

¿Qué me estoy perdiendo?

JK Laiho
fuente

Respuestas:

2

Estás malentendido cómo se pasan los argumentos.

Cuando ejecutas python -c "print 'foo'"el shell, lo analiza

  • python
  • -c
  • print 'foo'

entonces Python termina viendo dos argumentos.

Cuando ejecuta pyt -c "print 'foo'"la línea python $@se expande a (el equivalente de) python -c print 'foo', que se convierte en token

  • python
  • -c
  • print
  • foo

es decir pitón ve tres argumentos, y se ejecutará el comando print, con la cadena fooen sys.argv[1].

Lo que debe hacer es usar un token de shell mágico: en lugar de solo $@usarlo "$@"(deben ser comillas dobles). Eso le dice al shell que mantenga los argumentos juntos; cuando corres pyt -c "print 'foo'", la línea python "$@"se expande a (el equivalente de) python -c "print 'foo'".

Gabe
fuente