我有一个简单的 bash 脚本,它允许cron
在virtualenv
. 该脚本不断引发No such file or directory
错误。
~/nightly.sh
工作正常:
#!/bin/bash
source virt_env/myproject/bin/activate
cd virt_env/myproject/main
python script1.py
python script2.py
我想保留所有内容~/virt_env/myproject/main/
以简化部署。我想我可以调用bash virt_env/myproject/main/nightly.sh
这个:
#!/bin/bash
MAINDIR=`dirname $0`
cd $MAINDIR
source ../bin/activate
python script1.py
python script2.py
但我得到了No such file or directory
。如果我手动cd
执行~/virt_env/myproject/main/
,那么我可以运行主要命令没问题。显然,我错过了在这种情况下如何dirname
和cd
工作的一些东西。
如何将 bash 指向正确的位置?
解决方案
正如接受的答案中所建议的那样,最好避免cd
从脚本中调用,而是使用显式路径变量。这是的工作版本virt_env/myproject/main/nightly.sh
:
#!/bin/bash
MAINDIR=`dirname $0`
echo "The main directory is" $MAINDIR
# Activate virtual environment
source $MAINDIR/../bin/activate
# Run Python scripts
python $MAINDIR/python1.py
python $MAINDIR/python2.py
因为 Python 脚本现在是从任意路径调用的,所以我需要更新 Python 脚本以更智能地了解路径感知。
此代码失败,因为os.path.basename
省略了路径信息:
# works when called with "python python1.py"
# fails when called with "python $MAINDIR/python1.py"
CONFIG_FILE = os.path.basename(__file__)[:-3] + ".config"
f = open(CONFIG_FILE,"r")
更新它以使用可以os.path.abspath
解决问题:
# works regardless of how it is called
CONFIG_FILE = os.path.abspath(__file__)[:-3] + ".config"
f = open(CONFIG_FILE,"r")