如何抑制Bash中的函数输出?

时间:2020-09-02 07:17:34

标签: bash terminal

我写了一个小助手来启动一个如下所示的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代码的技巧。

2 个答案:

答案 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不会受到subshel​​l更改目录的影响

相关问题