I prepared a little bash script to toggle the visibility of my hidden OS X files.

if (defaults write com.apple.finder AppleShowAllFiles FALSE); then
    defaults write com.apple.finder AppleShowAllFiles TRUE
elif (defaults write com.apple.finder AppleShowAllFiles TRUE); then
    defaults write com.apple.finder AppleShowAllFiles FALSE

killall Finder

When hidden files are invisible, the script successfully makes them visible but afterwards, when I re-run the script to make the hidden files invisible again, it fails and does nothing.

Where am I going wrong?

  • 1
    Did you try adding debug information to 'see' what the script thinks it is doing? Did you try running it with the dash x option (e.g. change the first two lines to #!/usr/bin/env bash and the second line to set -x).
    – Hennes
    Jul 13, 2013 at 14:06
  • I got the following output + defaults write com.apple.finder AppleShowAllFiles FALSE + defaults write com.apple.finder AppleShowAllFiles TRUE + killall Finder It seems the if-else part is not working at all Jul 13, 2013 at 15:22

1 Answer 1


In the if conditions you should use the defaults read command, and not write. Otherwise the result is always true and of course the elif never runs.

Also, that is not the syntax for if conditions. You should use:

if [ $(command) == "TRUE" ]; then

But in this case, perhaps something like this would be less verbose:

STATUS=$(defaults read com.apple.finder AppleShowAllFiles)
case "$STATUS" in
defaults write com.apple.finder AppleShowAllFiles $OPTION

killall Finder
  • That read/write situation came to my mind as well yesterday after debugging. Nice spotting. Thanks for your solution as well. You've been very helpful. Jul 14, 2013 at 9:00

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.