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

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

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 embargo , necesito estar en una ruta determinada y pasar DJANGO_SETTINGS_MODULEa ella, así que pensé en envolver todo dentro de una función bash a la que podría llamar.pyt -c [...]

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

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 coloco echo $@dentro de la función, todos los parámetros se imprimen bien. El intérprete de Python tampoco se inicia (lo es si simplemente escribo pyt), por lo que el parámetro -c parece teneralgunoefecto: simplemente no se imprime nada.

¿Qué me estoy perdiendo?

Respuesta1

Estás entendiendo mal cómo se transmiten 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 a) python -c print 'foo', que se tokeniza como

  • python
  • -c
  • print
  • foo

es decir, Python ve tres argumentos y ejecutará el comando printcon la cadena fooen sys.argv[1].

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

información relacionada