4

I want to be able to hide and show the Wi-Fi menu item from the Terminal. Can I do this with the defaults command?

I've narrowed it down to com.apple.systemuiserver. It looks like this:

{
    "NSWindow Frame NoTimeLeft" = "471 437 475 163 0 0 1366 746 ";
    "__NSEnableTSMDocumentWindowLevel" = 1;
    menuExtras =     (
        "/System/Library/CoreServices/Menu Extras/Script Menu.menu",
        "/System/Library/CoreServices/Menu Extras/AirPort.menu",
        "/System/Library/CoreServices/Menu Extras/TimeMachine.menu",
        "/System/Library/CoreServices/Menu Extras/Battery.menu",
        "/System/Library/CoreServices/Menu Extras/Clock.menu"
    );
}

Preferences Screenshot

3

A big difficulty here is that the menuExtras key in com.apple.systemuiserver is an array that's reordered when you drag your Menu Extras around in the menu bar (and add and remove them).

In your case cited above, the Wi-Fi Menu Extra is the second item (which is array index 1 because these arrays are zero-indexed like C arrays), so you could remove it with PlistBuddy, which isn't in your $PATH because it's hidden in /usr/libexec. You have to use PlistBuddy because the defaults command doesn't have syntax for specifying an array index. Then kill SystemUIServer to get it to reload:

/usr/libexec/PlistBuddy -c 'Delete :menuExtras:1' ~/Library/Preferences/com.apple.systemuiserver.plist
killall SystemUIServer

To add it back in, do something like this:

/usr/libexec/PlistBuddy -c 'Add :menuExtras:1 string "/System/Library/CoreServices/Menu Extras/AirPort.menu"' ~/Library/Preferences/com.apple.systemuiserver.plist
killall SystemUIServer

Note that this will break if you ever remove or add Menu Extras such that the Wi-Fi Menu Extra is not the second Menu Extra from the left in your menu bar. With a little more scripting work you could walk the menuExtras array looking for the AirPort (Wi-Fi) menu extra, note its index, then feed that into your PlistBuddy command.

3
  • This does edit com.apple.systemuiserver.plist correctly but airport is still there after killing SystemUIserver. It just moves to the left. This is odd. – ggustafsson Mar 8 '12 at 15:37
  • @ggustafsson Huh, it's working for me on Mac OS X Lion v10.7.3. You didn't do both the Delete and Add at the same time, did you? You're only supposed to do the Delete when you want to hide it, and the Add when you want to show it. – Spiff Mar 8 '12 at 22:17
  • It works half of the time. I can't find a pattern here. I'll try it out for a while and see what happens. There's a typo btw, it's should be "killall SystemUIServer" in the add box. – ggustafsson Mar 9 '12 at 4:38
0

I wrote a script that cycles through the menuExtras and deletes WiFi. If you know the name of the menu item in Menu Extras you could easily modify it for any other menu item. I did not put a kill SystemUIServer at the end of the script. If you want instantaneous satisfaction you could add that as the last line in the script. A logout/login should probably work as well. I am sure the sed lines could be cleaned up a bit, as well. This was tested on 10.8.4, but there is no reason it should not work going back at least to 10.6

#!/bin/sh

# Removes the Wifi menu from the menubar.
# This setting is set on a per-user basis, so needs to be run as the user
# Will require a logout. A 'kill SystemUIServer' might work?

OIFS="$IFS"

menutemp=$(defaults read com.apple.systemuiserver menuExtras)
menutemp2=$(echo $menutemp | sed 's/( //')
menutemp3=$(echo $menutemp2 | sed 's/ )//')

IFS=','
read -a menuitems <<< "$menutemp3"
IFS="$OIFS"

for (( i = 0 ; i < ${#menuitems[@]} ; i++ ))
do
    if [ "${menuitems[$i]}" = '"/System/Library/CoreServices/Menu Extras/AirPort.menu"' ]
    then
        /usr/libexec/PlistBuddy -c "Delete :menuExtras:$i" ~/Library/Preferences/com.apple.systemuiserver.plist
    fi
done
0

A different strategy for hiding the icons for all other users. Go to /System/Library/CoreServices/Menu Extras/, you will see several files that end with menu. Click on the menu you want to hide. Once the menu is selected, use the keyboard and hold Command + I for the Info menu.

Under Sharing & Permissions:, Click the Plus box (you may need to unlock this area first) and add you user name to the list, giving yourself Read & Write Privileges. Then change the privileges on Everyone to No Access. Leave System and Wheel alone. Close the window. Log-out and log-in as another user. You can hide many menus.

0

You can use the defaults way in terminal to just use this and don't forget to use the killall SystemUIServer or to restart/logout & login.

# Menu bar: hide the Time Machine, Volume, User and AirPort (WiFi) icons
for domain in ~/Library/Preferences/ByHost/com.apple.systemuiserver.*; do
defaults write "${domain}" dontAutoLoad -array \
    "/System/Library/CoreServices/Menu Extras/TimeMachine.menu" \
    "/System/Library/CoreServices/Menu Extras/Volume.menu" \
    "/System/Library/CoreServices/Menu Extras/User.menu" \
    "/System/Library/CoreServices/Menu Extras/AirPort.menu"
done
defaults write com.apple.systemuiserver menuExtras -array \
    "/System/Library/CoreServices/Menu Extras/Bluetooth.menu" \
    "/System/Library/CoreServices/Menu Extras/Battery.menu" \
    "/System/Library/CoreServices/Menu Extras/Clock.menu"
killall SystemUIServer

So just move the once you want to hide in the dontAutoLoad array and the ones you wan't visible in the menuExtras array.

0

Managed to make it work on High Sierra 10.13.6 with this set of commands. This will remove all menu items tho, but this is what I need.

defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.airport" 0
defaults delete com.apple.systemuiserver menuExtras
defaults -currentHost write com.apple.systemuiserver dontAutoLoad -array "/System/Library/CoreServices/Menu Extras/AirPort.menu"
killall SystemUIServer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.