
Bash 셸에 있는 동안 Django 설정 값을 인쇄해야 합니다.
기본적으로 제가 실행하고 싶은 명령은 입니다 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'
그래서 파이썬은 결국 두 개의 인수를 보게 됩니다.
실행하면 pyt -c "print 'foo'"
라인이 python $@
(동일)로 확장되어 다음 python -c print 'foo'
과 같이 토큰화됩니다.
python
-c
print
foo
print
즉, Python은 세 개의 인수를 보고 에 있는 문자열을 사용하여 foo
명령 을 실행합니다 sys.argv[1]
.
당신이 해야 할 일은 그냥 $@
사용하는 대신 매직 쉘 토큰을 사용하는 것입니다 "$@"
(큰따옴표여야 함). 이는 쉘이 인수를 함께 유지하도록 지시합니다. 을 실행하면 pyt -c "print 'foo'"
라인이 python "$@"
(동일)로 확장됩니다 python -c "print 'foo'"
.