Передача параметров в python -c внутри функции bash?

Передача параметров в python -c внутри функции bash?

Мне нужно вывести значение настройки Django, находясь в оболочке Bash.

По сути, команда, которую я хотел бы запустить, это python -c 'from django.conf import settings; print settings.MEDIA_ROOT'. Мне нужно находиться на определенном пути и перейти DJANGO_SETTINGS_MODULEк нему, поэтому я подумал, что оберну все это в функцию bash, которую я мог бы вызвать вместо этого,pyt -c [...]

Я успешно использовал его $@в прошлом в подобных ситуациях, поэтому я надеялся, что он поможет и здесь. Но он не работает, так как я настроил его прямо сейчас.

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

Если я набираю pyt -c "print 'foo'"для проверки, "foo" не печатается. Пустая строка печатается. python -c "print 'foo'"печатает правильно, так что это как-то связано с моей функцией здесь.

Если я помещаю echo $@внутрь функции, все параметры печатаются просто отлично. Интерпретатор Python также не запущен (он запущен, если я просто набираю pyt), поэтому параметр -c, похоже, имеетнекоторыйэффект — ничего просто так не распечатывается.

Что я упускаю?

решение1

Вы не понимаете, как передаются аргументы.

При запуске python -c "print 'foo'"оболочка разбирает его на

  • python
  • -c
  • print 'foo'

поэтому python в итоге видит два аргумента.

При запуске pyt -c "print 'foo'"строка python $@расширяется до (эквивалент) python -c print 'foo', который токенизируется как

  • python
  • -c
  • print
  • foo

т.е. python видит три аргумента и выполнит команду printсо строкой fooв sys.argv[1]​​.

Что вам нужно сделать, так это использовать магический токен оболочки: вместо простого $@использования "$@"(это должны быть двойные кавычки). Это говорит оболочке хранить аргументы вместе; когда вы запускаете pyt -c "print 'foo'", строка python "$@"расширяется до (эквивалент) python -c "print 'foo'".

Связанный контент