【问题标题】:"Command not found" when adb is run from a function but not otherwise从函数运行 adb 时出现“找不到命令”,但不是以其他方式运行
【发布时间】:2021-03-07 12:51:26
【问题描述】:

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

install_apk_on_device() {
  set -x
  local device=${1}
  local path=${2}

  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

另外,如果我将 adb 命令从 else-branch 中取出到函数的请求处,它会按预期工作

install_apk_on_device() {
  adb -s "$1" install -r "$2"
  local device=${1}
  local path=${2}

  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 
)

混淆了我写错了:-)

【问题讨论】:

  • "adb -s ${device} install -r ${path}" 全部放在引号中在命令行上也不起作用。当您以adb -s "$device" install -r "$path" 运行它时,它可以工作,但引号围绕单个参数(以阻止它们本身被拆分为多个参数),而不是整个命令(需要被拆分为多个论据)。
  • (请注意,${device}$device 在这种情况下彼此没有优势;而将其设为 "${device}""$device" 时,正确性会明显提高——双引号禁止字符串拆分和通配符;大括号仅在您参数化扩展或连接到具有相邻字符的字符串时才起作用,否则这些字符可能作为变量名的一部分有效)。
  • 尝试运行不带引号的函数,例如:adb -s "$device" install -r "$path"。然后终端说command not found: adb,但是我的~/.zshrc 中有路径。所以它仍然不起作用:-(
  • 让我更困惑的是reconnect() { adb kill-server && adb start-server }这个函数完美运行????
  • 为什么会让人困惑? reconnect() { adb kill-server && adb start-server; } 预计是完美的。至于为什么adb -s "$device" install -r "$path" 不起作用,我们需要检查您的PATH 在工作情况和损坏情况下的情况,以了解它们之间的不同之处。

标签: macos shell unix zsh


【解决方案1】:

不同于 bash(和其他符合 POSIX 的 shell;这是 zsh 违反规范的地方,就像 the standard specifies 那样,只有命名空间中的全大写名称用于环境变量 - 也是 em> 用于常规 shell 变量的命名空间 -- 应该对 POSIX 指定的工具有意义),名称 path 即使是小写字母也对 zsh 有意义。更改您的变量名称。

也就是说,不是local path=${2}(在zsh中,它会更改活动的PATH作为副作用),而是改为local apk_path=$2

install_apk_on_device() {
  local device apk_path
  device=$1; apk_path=$2

  [[ -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"
}

【讨论】:

    【解决方案2】:

    尝试引用作业

      local device="${1}"
      local path="${2}"
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多