我写了一个小助手来启动一个如下所示的Android模拟器:
# START ANDROID EMULATION
android-sim () {
if [[ -z "$1" ]]; then
echo "No Android device supplied as argument!"
return 1
fi
if [[ -d "$ANDROID_HOME" ]]; then
cd "$ANDROID_HOME/emulator" &>/dev/null
./emulator "@$1" &>/dev/null &
cd - &>/dev/null
else
echo "The variable ANDROID_HOME is not set to a correct directory!"
fi
}
我试图用&>/dev/null
禁止所有生成的输出。对于emulator
本身,我还尝试将执行置于后台。
但是当我运行该函数时,我仍然得到以下输出:
# before exeuction
[09:11:48] sandrowinkler:~ $ android-sim pixel-29
[1] 23217
# after execution, I closed the emulator via GUI
[09:11:55] sandrowinkler:~ $
[1]+ Done ./emulator "@$1" &> /dev/null
(wd: /usr/local/share/android-sdk/emulator)
(wd now: ~)
根据此superuser post和此unix post,我使用了正确的方法来使输出静音。那么我在这里做错了什么?
PS:我也希望获得一些改进Bash代码的技巧。
答案 0 :(得分:1)
您已正确完成。该输出不是来自您的脚本,而是来自外壳程序,显示有关后台进程的信息(结尾处是PID,done消息和工作目录)。
如果您从外部重定向输入,例如:
andoroid-sim foo > log.txt
执行后,打开log.txt
,您将看到程序实际输出的内容(即使这些消息出现在控制台中,这些消息也不会存在)。
答案 1 :(得分:1)
如果不需要监视后台作业,则可以使用双叉解决方案。
s.preserve_paths = 'JWPlayer_iOS_SDK.framework'
s.xcconfig = { 'OTHER_LDFLAGS' => '-framework JWPlayer_iOS_SDK' }
s.vendored_frameworks = 'JWPlayer_iOS_SDK.framework'
当父进程在子进程之前退出时,子进程将附加到进程1,因此不再受当前shell的监视。
还要查看脚本,可以避免 ( ./emulator "@$1" &>/dev/null & )
更改子shell中的目录:
cd -
因为当前的shell不会受到subshell更改目录的影响