
我需要在 Bash shell 中列印 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'"
shell 時,會將其解析為
python
-c
print 'foo'
所以 python 最終看到兩個參數。
當您運行時,pyt -c "print 'foo'"
該行將python $@
擴展為(相當於)python -c print 'foo'
,它被標記為
python
-c
print
foo
即 python 看到三個參數,並將運行命令print
,其中字串foo
為sys.argv[1]
。
您需要做的是使用 magic shell token: 而不是僅僅$@
使用"$@"
(它必須是雙引號)。這告訴 shell 將參數保持在一起;當您運行時pyt -c "print 'foo'"
,該行將python "$@"
擴展為(相當於)python -c "print 'foo'"
。