Есть ли способ заставить мой macbook автоматически запускать скрипт каждый раз, когда я подключаю его к внешнему монитору?
Я хотел бы, чтобы мой macbook автоматически подключался к определенному Wi-Fi и запускал Lunar каждый раз, когда я подключаю его к внешнему монитору, и наоборот, когда я отключаю его, но не знаю, с чего начать ...
Я мог бы написать сценарий, который постоянно проверяет, подключен ли внешний монитор каждые, например, 60 секунд, но я хотел бы сделать что-то вроде «управляемое событием», которое не проверяет и не делает вообще ничего, пока не произойдет событие (" внешний монитор подключен "или" внешний монитор отключен ").
Намек?
Ответы
Никто не ответил, и я все еще ищу более простое решение, но я нашел обходной путь, создав небольшое приложение SwiftUI.
//
// ContentView.swift
// HomeSweetHome
//
// Created by Daniel Falbo on 20/08/2020.
// Copyright © 2020 Daniel Falbo. All rights reserved.
//
import SwiftUI
struct ContentView: View {
func execute(script: String) {
let task = Process()
task.launchPath = "/usr/bin/env"
task.arguments = ["/Applications/HomeSweetHome.app/Contents/bin/\(script)"]
task.launch()
}
var body: some View {
Text("🏡")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.onReceive(NotificationCenter.default.publisher(for: NSApplication.didChangeScreenParametersNotification)) { _ in
self.execute(script: NSScreen.screens.count > 1 ? "connect" : "disconnect")
}
}
}
По сути, это просто объект Text, который прослушивает didChangeScreenParametersNotification . Поскольку объект Text должен быть активным, чтобы получать уведомления, приложение всегда должно быть открыто или минимизировано (есть ли у кого-нибудь идеи, как этого избежать?). Каждый раз, когда он получает уведомление, он проверяет количество подключенных дисплеев, если подключен только один дисплей, он выполняет мой disconnect
скрипт, иначе он выполняет мой connect
скрипт.
Вот как выглядят скрипты:
#!/usr/bin/env sh
#
# connect
#
open -a Lunar
networksetup -setairportnetwork en0 $SSID $PASSWORD
#!/usr/bin/env sh
#
# disconnect
#
killall Lunar
networksetup -setairportnetwork en0 $SSID $PASSWORD
А вот как выглядит приложение 😂

Это помогло мне программно подключиться к Wi-Fi