
Мне нужно вывести значение настройки 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'"
.