
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_MODULE
a 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 print
con la cadena foo
en 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'"
.