Есть ли способ заставить мой macbook автоматически запускать скрипт каждый раз, когда я подключаю его к внешнему монитору?

Aug 18 2020

Я хотел бы, чтобы мой macbook автоматически подключался к определенному Wi-Fi и запускал Lunar каждый раз, когда я подключаю его к внешнему монитору, и наоборот, когда я отключаю его, но не знаю, с чего начать ...

Я мог бы написать сценарий, который постоянно проверяет, подключен ли внешний монитор каждые, например, 60 секунд, но я хотел бы сделать что-то вроде «управляемое событием», которое не проверяет и не делает вообще ничего, пока не произойдет событие (" внешний монитор подключен "или" внешний монитор отключен ").

Намек?

Ответы

2 Daniel Aug 23 2020 at 14:08

Никто не ответил, и я все еще ищу более простое решение, но я нашел обходной путь, создав небольшое приложение 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