1

У меня есть цикл, который будет запрашивать пароль 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

2

шаг за шагом.

  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 (нет такого файла или каталога)) с выходным значением (может быть любым, текстовым или двоичным).

Оболочкам (bash/dash/whateversh) можно указать, чтобы они смотрели код возврата (set -e), или в test .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .