Parameter an python -c innerhalb einer Bash-Funktion übergeben?

Parameter an python -c innerhalb einer Bash-Funktion übergeben?

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_MODULEjedoch 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 printmit der Zeichenfolge foodarin 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'".

verwandte Informationen