为什么“sudo -n true”在循环/条件中的括号内不起作用?

为什么“sudo -n true”在循环/条件中的括号内不起作用?

我有一个循环,它会提示sudo输入密码,直到输入正确为止。至于为什么,我并不关心,我们只能说这是一个更大脚本的一部分,其他解决方案并不合适。

until sudo -n true 2> /dev/null; do
  read -s -p "Password:" sudo_password
  sudo -S -v <<< "${sudo_password}" 2> /dev/null
done

这种方法很有效。但是,如果放在括号内,这种方法就不起作用了

until [[ $(sudo -n true 2> /dev/null) ]]; do
  read -s -p "Password:" sudo_password
  sudo -S -v <<< "${sudo_password}" 2> /dev/null
done

我尝试了无数种方法,既有循环也有条件。我甚至还这样做

until [[ $(sudo -n true 2> /dev/null; echo "$?") -ne 0 ]]; do
  read -s -p "Password:" sudo_password
  sudo -S -v <<< "${sudo_password}" 2> /dev/null

  # check exit status is indeed 0
  sudo -n true 2> /dev/null
  echo "$?"
done

这也行不通,我不明白为什么。实际上,即使密码错误,这种情况也总是返回0(根据上一个echo "$?"),但即使密码正确,它也不会跳出循环,这更奇怪。


编辑:刚刚意识到为什么最后一个不起作用,而在其他情况下似乎有效。通过那个特定的比较,它应该是while,而不是until

答案1

一步步。

  1. until sudo -n true 2> /dev/null; do这将评估sudo -n true,丢弃标准错误,并向提供返回代码until

  2. $(sudo -n true 2> /dev/null)

    2.1 评估sudo -n true

    2.2 丢弃标准错误 2> /dev/null

    2.3 取标准输出空的

  3. until [[ $(sudo -n true 2> /dev/null) ]]; do

    3.1-3.3 同上

    3.4 使用 [[空的]] 这很可能是一个错误

  4. until [[ $(sudo -n true 2> /dev/null; echo "$?") -ne 0 ]]; do

    4.1至4.4 同上

    4.5 比较空的至 0

第一行是正确的,sudo提供一个返回代码,只需使用它。

一个常见的错误是误解返回代码:一个整数(通常为 0 或 1 或 2(没有这样的文件或目录))和输出(可以是任何东西,文本或二进制)。

可以指示 Shell(bash/dash/whateversh)监视返回代码(set -e),或者在test

相关内容