bash 함수 내에서 python -c에 매개변수를 전달하시겠습니까?

bash 함수 내에서 python -c에 매개변수를 전달하시겠습니까?

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'".

관련 정보