使用 bash -c 执行字符串命令时如何控制路径?

使用 bash -c 执行字符串命令时如何控制路径?

背景,我正在尝试使用一个Python库,该库使用arguments生成一个子进程["bash", "-c", "python someScript.py"]。发生的情况是执行了 Python 2.6,但我想要 python2.7。 Python 2.6 已上线/usr/bin/,Python 2.7 已上线/usr/local/bin

如果我说python -V并且type python我得到:

Python 2.7.10python is aliased to /usr/local/bin/python2.7

.bashrc(注意,我已经在我的文件中设置了这个别名alias python=/usr/local/bin/python2.7:)

但是,如果我调用bash -c "type python"我会得到:

python is /usr/bin/python

echo $PATH和都bash -c "echo $PATH"输出相同的路径:

/usr/local/bin:/usr/local/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/lib:/usr/local/lib

/usr/local/bin请注意,当我在 .bashrc 中导出 PATH 时,我尝试将其放在第一位。

所以我的问题是,当我使用 执行字符串命令时,什么控制路径(在本例中为 Python)bash -c?具体来说,如何bash -c "python"使用 Python 2.7?编辑:参数["bash", "-c", "python someScript.py"]是硬编码在库中的,我不想修改库源。

答案1

问题是,在执行 时bash -c '....',您正在生成 的非交互式(且非登录)会话bash,这不会有source任何运行时配置文件,例如~/.bashrc

当您定义了aliasin 时~/.bashrc,您可以使用该-i选项来bash模拟交互式环境以及source文件~/.bashrc

bash -ic '....'

现在alias应该可用了。

例子:

$ alias l
alias l='ls'

$ bash -c 'l'
bash: l: command not found

$ bash -ic 'l'
bar  foo

答案2

使用命令的完整路径。bash -c /usr/local/bin/python

答案3

我认为您的 .bashrc 不是源自非交互式 shell,例如这样 - 尝试将 PATH 设置放入您的 .profile 文件中,这也适用于其他一些 shell(或 .bash_profile 如果您只想将其设置为 bash )。

相关内容