
Ich muss den Wert einer Django-Einstellung in einer Bash-Shell ausdrucken.
Im Grunde ist der Befehl, den ich ausführen möchte python -c 'from django.conf import settings; print settings.MEDIA_ROOT'
, . Ich muss mich DJANGO_SETTINGS_MODULE
jedoch in einem bestimmten Pfad befinden und dorthin gelangen, also dachte ich, ich würde das Ganze in eine Bash-Funktion einbinden, die ich stattdessen aufrufen könnte.pyt -c [...]
Ich habe es $@
in der Vergangenheit in ähnlichen Situationen erfolgreich verwendet und hoffte daher, dass es auch hier helfen würde. Aber so, wie ich es jetzt eingerichtet habe, funktioniert es nicht.
function pyt {
cd $PROJECT_ROOT # set elsewhere, parent dir of my_site
DJANGO_SETTINGS_MODULE=my_site.settings python $@
cd $OLDPWD
}
Wenn ich pyt -c "print 'foo'"
es testweise eingebe, wird nicht „foo“ gedruckt. Eine leere Zeile schon. python -c "print 'foo'"
druckt es korrekt, also hat es etwas mit meiner Funktion hier zu tun.
Wenn ich echo $@
in die Funktion einfüge, werden alle Parameter einwandfrei ausgegeben. Der Python-Interpreter wird auch nicht gestartet (er wird gestartet, wenn ich nur eingebe pyt
), also scheint der Parameter -cmancheEffekt – es wird einfach nichts ausgedruckt.
Was vermisse ich?
Antwort1
Sie verstehen nicht, wie die Argumente weitergegeben werden.
Wenn Sie python -c "print 'foo'"
die Shell ausführen, wird es in
python
-c
print 'foo'
Python sieht also letztendlich zwei Argumente.
Beim Ausführen wird pyt -c "print 'foo'"
die Zeile python $@
zu (dem Äquivalent von) erweitert python -c print 'foo'
, was als tokenisiert wird
python
-c
print
foo
d. h. Python sieht drei Argumente und führt den Befehl print
mit der Zeichenfolge foo
darin aus sys.argv[1]
.
Sie müssen ein magisches Shell-Token verwenden: statt nur $@
use "$@"
(es muss in Anführungszeichen stehen). Dadurch wird die Shell angewiesen, die Argumente zusammenzuhalten. Wenn Sie ausführen pyt -c "print 'foo'"
, wird die Zeile python "$@"
zu (dem Äquivalent von) erweitert python -c "print 'foo'"
.