我需要在 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]
您需要做的是使用神奇的 shell 标记:而不是仅仅$@
使用"$@"
(必须是双引号)。这会告诉 shell 将参数保持在一起;当您运行 时pyt -c "print 'foo'"
,该行将python "$@"
扩展为(等同于)python -c "print 'foo'"
。