"Command not found" 当 adb 是 运行 来自一个函数时,否则不是

"Command not found" when adb is run from a function but not otherwise

在我的 ~/.zshrc 文件中找到函数,它打印 command not found: adb

install_apk_on_device() {
  set -x
  local device=
  local path=

  if [[ -z "${device}" ]]; then
    echo "The device is empty"
  elif [[ -z "${path}" ]]; then 
    echo "The path is empty"
  else 
    adb -s "$device" install -r "$path"
  fi
}

output: 

+install_apk_on_device:3> local device=emulator-5554
+install_apk_on_device:4> local path=MY_APK_PATH
+install_apk_on_device:6> [[ -z emulator-5554 ]]
+install_apk_on_device:8> [[ -z MY_APK_PATH ]]
+install_apk_on_device:11> adb -s emulator-5554 install -r MY_APK_PATH
install_apk_on_device:11: command not found: adb

但是,如果您 运行 这个 adb 命令直接使用相同的参数,例如 adb -s 52036d8b50671495 install -r .//androidApp/build/outputs/apk/debug/androidApp-debug.apk,apk 将被安装

此外,如果我从函数开始处的 else 分支中取出 adb 命令,它会按预期工作

install_apk_on_device() {
  adb -s "" install -r ""
  local device=
  local path=

  if [[ -z "${device}" ]]; then
    echo "The device is empty"
  elif [[ -z "${path}" ]]; then 
    echo "The path is empty"
  fi
}

这些是我的路径:

PATH=/bin:/usr/bin:/usr/local/bin:${PATH}
export PATH
export HOME=/Users/ruanvd5
export JAVA_HOME=$HOME/Library/Java/JavaVirtualMachines/corretto-1.8.0_275/Contents/Home
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$HOME/Programming/elixirSourceCode/elixir/bin
export GRADLE_USER_HOME=$HOME/.gradle

此外,这是我的 declare -p PATH

export -T PATH path=( 
/bin /usr/bin /usr/local/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/munki /Library/Apple/usr/bin 
/Users/ruanvd5/Library/Android/sdk/emulator 
/Users/ruanvd5/Library/Android/sdk/tools 
/Users/ruanvd5/Library/Android/sdk/tools/bin 
/Users/ruanvd5/Library/Android/sdk/platform-tools 
/Users/ruanvd5/Programming/elixirSourceCode/elixir/bin 
)

混淆我写错了:-)

尝试引用作业

  local device=""
  local path=""

与 bash(和其他 POSIX 兼容的 shells 不同;这是 zsh 违反规范的地方,因为 the standard specifies 只有全大写名称在用于环境变量的名称空间中——也是用于常规shell变量的名称空间——应该对POSIX指定的工具有意义), name path 对 zsh 有意义,即使是小写。更改您的变量名称。

也就是说,而不是 local path=(在 zsh 中,改变活动 PATH 作为副作用),使其成为 local apk_path=.

install_apk_on_device() {
  local device apk_path
  device=; apk_path=

  [[ -z $device ]] && { echo "The device is empty" >&2; return 1; }
  [[ -z $apk_path ]] && { echo "The path is empty" >&2; return 1; }

  adb -s "$device" install -r "$apk_path"
}