3

Мне нужно напечатать значение параметра 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 ответ1

2

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

Когда вы запускаете 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'" .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .