怎么来的,即直接从bash -c回显$PATH :
docker exec -i -t my_container bash -c "echo $PATH"
为$PATH返回一个不同的值,即开始一个交互式bash会话并回显$PATH ?
docker exec -i -t my_container bash root@21e6d898c3c2:/# echo $PATH
为了给这个问题一些上下文,我想在docker exec的容器中运行一个命令,并且如果我启动交互式bash会话,则该命令在path上,但不是如果我只是运行该命令。
在这种情况下,使用可执行文件的完整path并不是一种解决方法,因为命令依赖于其他环境variables,就像PATH在bash交互式会话中设置的一样,但不是如果我直接运行命令。
当指定-c , bash不会以交互式或login shell运行,所以它不会读取相同的启动脚本。 在/etc/profile , ~/.bash_profile , ~/.bash_login或~/.profile设置的任何东西肯定都会被跳过。
另外,正如bash手册页所解释的那样:
Bash试图确定它何时以其标准input连接到networking连接来运行,就像由远程shell守护进程(通常是
rshd)或安全shell守护进程sshd。 如果bash确定以这种方式运行,它将读取并执行~/.bashrc和~/.bashrc,如果这些文件存在且可读的话。
所以如果它不认为你通过networking连接,它可能不会读取.bashrc文件,它会跳过上一步没有跳过的所有内容。
要解决此问题,我将创build一个脚本,将PATH设置为适合的内容,然后运行该命令。 如果你想使用现有的.profile或其他文件,那么你可以在脚本中源 。