我正在开发一个嵌入式 Linux 系统(kernel-5.10.24),它使用ash
from busybox
as /bin/sh
。系统支持从串口控制台和adb shell
PC机登录。
现在我发现shell
从串行控制台启动确实读取了中定义的环境/etc/profile
,但shell
启动的adb shell
却没有。
例如,/etc/profile
如下所示,
# cat /etc/profile
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
if [ "$PS1" ]; then
if [ "`id -u`" -eq 0 ]; then
export PS1='# '
else
export PS1='$ '
fi
fi
在串行控制台中,
# echo $HOME
/root
# echo $ENV
# echo $PATH
/bin:/sbin:/usr/bin:/usr/sbin
但在adb shell
,
/sys/kernel/config/usb_gadget # echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin
/sys/kernel/config/usb_gadget # echo $HOME
/
启动的 shelladb shell
是adbd
在目标 Linux 中启动的,那么有没有办法让 shell 启动来adb shell
读取/etc/profile
其环境的其他配置文件?
答案1
您可以尝试使用包装脚本来实现您所要求的:
adb shell 'ENV=/etc/profile sh -i'
一个简单的别名可以是:
alias adbshellenv="adb shell 'ENV=/etc/profile sh -i'"
答案2
经过大量的研究和测试,我想我找到了一种方法来解决我的请求/答案。
首先,更改源代码以调用目标Linux中adbd
的包装器脚本。 包装器脚本至少调用 2 个东西,如下所示:/etc/init.d/adbshell_wrapper.sh
#!/bin/sh
/etc/profile
/bin/sh
通过此解决方案,可以获得与串行控制台adb shell
相同的环境。login
答案3
INVOCATION
从章节开始man bash
:
登录 shell 的参数零的第一个字符是
-
,或者以选项开头--login
。
因此,只需更改adbd
以设置argv[0]
它开始的外壳,例如-bash
。