我有一个循环,它会提示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
一步步。
until sudo -n true 2> /dev/null; do
这将评估sudo -n true
,丢弃标准错误,并向提供返回代码until
。$(sudo -n true 2> /dev/null)
这2.1 评估
sudo -n true
,2.2 丢弃标准错误 2> /dev/null
2.3 取标准输出空的
until [[ $(sudo -n true 2> /dev/null) ]]; do
这3.1-3.3 同上
3.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
。