Alpine无法加载/etc/profile。

13 浏览
0 Comments

Alpine无法加载/etc/profile。

我试图编写一个(我认为应该是)简单的bash脚本,它将:\n

    \n

  1. 运行virtualenv在$1处创建一个新的环境
  2. \n

  3. 激活虚拟环境
  4. \n

  5. 做一些其他的事情(安装django,将django-admin.py添加到虚拟环境的路径等)
  6. \n

\n第1步工作得很好,但是我似乎无法激活虚拟环境。对于那些不熟悉virtualenv的人来说,它会创建一个激活虚拟环境的activate文件。从CLI中,您可以使用source运行它\n

source $env_name/bin/activate

\n其中$env_name,显然,是安装虚拟环境的目录的名称。\n在我的脚本中,在创建虚拟环境之后,我将激活脚本的路径存储如下:\n

activate="`pwd`/$ENV_NAME/bin/activate"

\n但是当我调用source \"$activate\"时,我得到以下结果:\n

/home/clawlor/bin/scripts/djangoenv: 20: source: not found

\n我知道$activate包含正确的激活脚本路径,事实上,我甚至在调用source之前测试了文件是否存在。但是source本身似乎找不到它。我还尝试在CLI中手动运行所有步骤,结果一切正常。\n在我的研究中,我发现了这个脚本,它与我想要的类似,但也做了很多其他我不需要的事情,比如将所有的虚拟环境存储在~/.virtualenv目录中(或者$WORKON_HOME中的任何内容)。但是我觉得他创建了activate的路径,并以基本上和我一样的方式调用了source \"$activate\"。\n这是完整的脚本:\n

#!/bin/sh
PYTHON_PATH=~/bin/python-2.6.1/bin/python
if [ $# = 1 ]
then
    ENV_NAME="$1"
    virtualenv -p $PYTHON_PATH --no-site-packages $ENV_NAME
    activate="`pwd`/$ENV_NAME/bin/activate"
    if [ ! -f "$activate" ]
    then
        echo "ERROR: activate not found at $activate"
        return 1
    fi
    source "$activate"
else
    echo 'Usage: djangoenv ENV_NAME'
fi

\n免责声明:我的bash脚本技能非常弱。我在CLI中相当熟练,但是可能有一些极其愚蠢的原因导致这个脚本无法工作。

0
0 Comments

问题的原因是在Ubuntu中,如果使用sh scriptname.sh命令来执行脚本,会出现"Alpine not loading /etc/profile"的问题。解决方法是改用./scriptname.sh命令来执行脚本。然而,尝试使用该命令时出现了"segmentation fault"的错误。解决该错误的方法是确保文件具有执行权限,可以通过chmod +x filename.sh命令为文件添加执行权限。至于为什么会出现这个问题,目前还不清楚。

0
0 Comments

Alpine不加载/etc/profile的问题出现的原因是在POSIX标准中,/bin/sh命令应该使用的是"."(一个单点),而不是source命令。source命令是从csh中引入到bash中的。解决方法是将/bin/sh更改为/bin/bash。这样可以修复问题。在脚本完成后,命令行界面中的环境未被激活,但这只是一个小问题。

根据Bash手册,source是.的同义词。我在使用具有以下entrypoint的docker容器时遇到了这个问题:/bin/sh -c '/path/to/script.sh'。尽管我的脚本是一个bash脚本,但source命令无法加载exports。但是,"."命令可以正常工作!将source更改为"."对我有用,在shell中进行测试时使用source是有效的,但在Jenkins中失败了。非常感谢这个解决方法,它在shell中和尤其是在Jenkins中都起作用。

0
0 Comments

问题出现的原因是/bin/sh不保证是bash。解决方法是在bash脚本中使用#!/bin/bash来调用bash。使用源内置命令在bash中可以正常工作,但最好还是像Norman建议的那样使用点。如果之前你只是输入source ~/.bashrc来调用bash,那么现在应该使用bash ~/.bashrc来调用。

0