Я написав bash-скрипт, щоб перевірити різні конфігурації в системі, але я отримую різні результати в залежності від того, чи він запускається з командного рядка безпосередньо або зі сценарію. Ось команда:
bt_discoverable=$(system_profiler SPBluetoothDataType | grep Discoverable)
Якщо вимкнути виявлення на Bluetooth, а потім передати змінну в командному рядку, я отримаю очікуваний результат:
Discoverable: No
Але якщо я повторюю його відразу після запуску тієї ж команди з скрипта bash, я отримую
Discoverable: Yes
Сценарій підвищує свої привілеї через внутрішню функцію sudo, тому я прокоментував блок для цієї функції і запустив сценарій знову. Цього разу справи працювали так, як повинні. Ось функція висоти:
RunAsRoot()
{
if [[ "${USER}" != "root" ]] ; then
echo
echo
echo "*** Type the password for ${USER} and press ENTER ***"
echo
sudo $1 && exit 0
fi
}
RunAsRoot $0
Ця функція є першою справою, яку виконує скрипт, тому позиція коду є проблемою.
Чому при запуску в підвищених привілеях (під) оболонка викликає цю проблему? Це проблема терміналу, Bash, або щось ще я не знаю?
~/Library/Preferences/ByHost/com.apple.BlueTooth.<uuid>
, можливо, користувач root тимчасово створює свій власний файл BlueTooth, перебуваючи в підпідниці, і ваш скрипт перевіряє це значення замість того, щоб користувач увійшов у повну версію OS X. Я сподіваюся, що це має сенс, і це лише здогадка. :) Які речі у вашому сценарії вимагають root? Особливо, якщо ви просто перевіряєте значення system_profiler?