재택근무 시에는 맥북 음량을 켜놓는데 사무실 출근하면 음소거를 해야 하기 때문에 번거롭다.
hammerspoon으로 이를 구현할 수 있다고 듣긴 했는데, 이거 하나 때문에 hammerspoon을 설치하긴 싫어서 버티고 있다가, 스크립트로 자동화해볼까 싶어서 해보기로 했다.
[특정 와이파이 연결 시 음소거]
1. 설정하려는 Wi-Fi 이름 확인하기
networksetup -getairportnetwork en0
위 명령어로 볼륨 조절이 필요한 Wi-Fi의 이름을 확인한다.
Wi-Fi 이름을 알고 있다면 스크립트에 직접 적으면 되지만, 내가 설정하려는 Wi-Fi는 이름이 길어서 직접 치기 번거로워 명령어로 확인해 주었다.
Current Wi-Fi Network: your-wifi-name
위처럼 your-wifi-name 자리에 현재 연결된 Wi-Fi 이름이 나온다.
2. 쉘 스크립트 만들기
원하는 위치에 실행할 스크립트 파일을 만든다.
나는 ~/scripts/wifi-volume-control.sh 로 만들었다.
#!/bin/bash
TARGET_SSID="????"
CURRENT_SSID=$(networksetup -getairportnetwork en0 | cut -d ':' -f2 | xargs)
if [ "$CURRENT_SSID" == "$TARGET_SSID" ]; then
osascript -e "set volume output volume 0"
fi
TARGET_SSID 의 물음표 자리에 1번에서 확인한 Wi-Fi 이름을 넣어준다.
[#!/bin/bash]
스크립트 중 1번 라인의 #!/bin/bash 는 스크립트를 어떤 셸로 실행할지를 지정하는 것으로, 스크립트가 정상적으로 실행되게 해주는 역할을 한다.
#!/bin/bash가 없으면 터미널에서 직접 스크립트를 실행할 때 bash를 명시적으로 지정해야 하거나 시스템이 기본 셸 (sh나 zsh)을 사용하여 실행하려 할 수 있는데 이때 bash 전용 문법이 포함되어 있으면 오류가 발생할 수 있다.
3. 실행 권한 부여
chmod +x ~/scripts/wifi-volume-control.sh
이 명령어로 우리가 만든 스크립트를 실행할 수 있게 만들어준다.
기본적으로 스크립트 파일은 실행 가능하지 않아서 실행하려면 권한을 부여해야 한다.
실행 권한이 없으면 Permission denied 오류가 발생할 수 있다.
[chmod +x의 뜻]
• chmod: 파일이나 디렉터리의 권한을 변경하는 명령어
• +x: 실행 권한을 추가. 해당 파일을 실행 가능한 상태로 만든다.
4. launchd 등록 파일 생성
아쉽게도 macOS에서 와이파이 변경 감지하는 공식 이벤트 트리거가 없다.
이를 감지하려면 Swift나 Objective-C로 네트워크 이벤트 감시를 해주어야 하는데 굳이 이렇게 까지 할 필요 없으니 간단하게 30초 주기로 와이파이 이름을 확인해 줄 것이다.
30초마다 Wi-Fi 상태를 확인하는 건 SSID 한 줄 읽어서 조건 검사하는 아주 가벼운 작업이기 때문에 30초마다 체크해도 시스템에 부담은 전혀 없다.
터미널에 다음 명령 입력:
nano ~/Library/LaunchAgents/com.user.wifi-volume-control.plist
열린 nano편집기에서 다음 내용 작성:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.wifi-volume-control</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/YOUR_USERNAME/scripts/wifi-volume-control.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>30</integer> <!-- 30초마다 실행 -->
</dict>
</plist>
* 중간에 YOUR_USERNAME 부분을 사용자 이름으로 바꿔준다.
* 이건 nano 편집기로 열었지만 vim, TextEdit, Xcode 어떤 걸로 열건 상관없다.
[nano 조작법]
• control + O (쓰기/저장) → 엔터
• control + X (종료)
5. launchd로 등록하기
마지막으로 다음 명령어를 터미널에 입력한다.
이 명령어는 macOS의 launchd 시스템에 내가 만든 자동화 작업(=launch agent)을 등록하는 명령어이다.
launchctl load ~/Library/LaunchAgents/com.user.wifi-volume-control.plist
6. 확인
볼륨을 1 이상으로 설정한 후, 잠시 후 볼륨이 다시 0으로 잘 변경되는지 확인해 보자.
그런데 이 작업을 하는 중간에 맥북이 기본 제공하는 Shortcuts로 이 기능을 쉽게 설정할 수 있다는 걸 알게 되었다.
이왕 시작했으니 끝까지 하긴 했지만 스크립트는 Wi-Fi 상태 변경을 감지하지 못하기도 하고(Shortcuts로는 Wi-Fi 상태가 변경될 때를 음량 변경을 해주기 때문에..), 굳이 스크립트를 만들어서 할 필요 없는 것 같다.
+
문제점을 발견했다.
스크립트 자체의 문제는 아니고 사무실 출근해서 회의실에 안 가고 자리에서 회의를 참석하는 경우 때문에 수정이 필요하다.
이 경우에는 음소거되면 안되기 때문에 해당하는 와이파이에 연결이 되어 있더라도 이어폰이 연결되었다면 볼륨이 줄어들면 안 된다.
그렇기 때문에 이어폰이 연결되었다면 음소거를 무시하는 코드를 추가해 보겠다.
[이어폰 연결 시 예외 처리 추가]
1. 출력 장치 확인
macOS에서는 SwitchAudioSource 라는 커맨드라인 유틸리티로 현재 오디오 출력 장치를 확인할 수 있다.
설치
brew install switchaudio-osx
현재 연결된 오디오 이름 확인
SwitchAudioSource -c
* 내 경우엔 '외장 헤드폰'이었다.
2. 스크립트 수정
#!/bin/bash
TARGET_SSID="[와이파이 이름]"
EXCLUDED_AUDIO_DEVICE="[출력 장치 이름]"
CURRENT_SSID=$(networksetup -getairportnetwork en0 | cut -d ':' -f2 | xargs)
CURRENT_OUTPUT=$(/opt/homebrew/bin/SwitchAudioSource -c)
if [ "$CURRENT_SSID" == "$TARGET_SSID" ]; then
if [[ "$CURRENT_OUTPUT" != *"$EXCLUDED_AUDIO_DEVICE"* ]]; then
osascript -e "set volume output volume 0"
fi
fi
3. 확인
와이파이 연결과 이어폰 연결 여부를 바꿔가면서 정상 동작하는지 확인해 본다.
'프로그래밍' 카테고리의 다른 글
맥북) 특정 폴더로 파일 추가하면 해당 파일 이름을 규칙에 맞게 자동 변경 (0) | 2025.05.08 |
---|---|
맥북 자동 음소거 기능 만들면서 발생했던 문제 해결 과정 (0) | 2025.05.07 |
Git 저장소의 핵심: .git 폴더와 git reflog 활용법 (git reset 복구하기) (0) | 2025.03.05 |
[VSCode 에러] 이 시스템에서 스크립트를 실행할 수 없으므로~~~ 해결방법 (0) | 2022.10.26 |
Sourcetree 에러: 잘못된 비밀번호 입력으로 저장소 접근 불가할 때 (0) | 2022.10.15 |