54

Googling this didn't show up any results. Here's what I mean: I have a binary file named x in my path (not the current folder, but it is in the PATH), and also a folder with the same name in the current working directory. If I type x, I want the binary to execute, but instead it cd's into that folder. How do I fix this?

1
  • 1
    The worst part of this "feature" is that subdirectories take precedence over binaries on the path. This is not how any conventional shell works! Commented Mar 18 at 9:28

2 Answers 2

79

TL; DR

Add this line to your ~/.zshrc:

unsetopt autocd

AUTO_CD Option and howto find it

First of all the option you are looking for is AUTO_CD. You can easily find it by looking up `man zshoptions`. Use your pagers search function, usually you press / and enter the keyword. With n you jump to the next occurrence. This will bring up the following:
[..]
   Changing Directories
       AUTO_CD (-J)
              If  a  command is issued that can't be executed as a normal command, and the command is the name of a directory, perform the cd command to that directory.
[..]

The option can be unset using unsetopt AUTO_CD.

Turning it properly off

You are using oh-my-zsh which is described as

"A community-driven framework for managing your zsh configuration" Includes 120+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), ...

So the next thing is to find out, how to enable/disable options according to the framework.

The readme.textile file states that the prefered way to enable/disable plugins would be an entry in your .zshrc: plugins=(git osx ruby) Find out which plugin uses the AUTO_CD option. As discovered from the manpage it can be invoked via the -J switch or AUTO_CD. Since oh-my-zsh is available on github, searching for it will turn up the file lib/theme-and-appearance.zsh. If you don't want to disable the whole plugin "theme-and-appearance", put a unsetopt AUTO_CD in your .zshrc. Don't modify the files of oh-my-zsh directly, because in case you are updating the framework, your changes will be lost.

Why executables are not invoked directly

Your third question is howto execute a binary directly: You have to execute your binary file via a path, for example with a prefixed `./` as in `./do-something`. This is some kind of a security feature and should not be changed. hing of plugging in an USB stick, mounting it and having a look on it with `ls`. If there is a executable called `ls` which deletes your home directory, everything would be gone, since this would have overwritten the order of your $PATH.

If you have commands you call repeatedly, setting up an alias in your .zshrc would be a common solution.

5
  • 5
    Thank you very much! What I needed was the unsetopt auto_cd line (I did explicitly mention that the executable is in my path though; nevertheless, the explanation might help other users figure things out). Commented Apr 27, 2014 at 10:06
  • Thank you for the thorough answer and providing details on how you found the information (thus helping others find information like this on their own in the future). Commented Sep 8, 2016 at 3:30
  • 3
    Your last paragraph makes no sense. The OP is asking about a binary in their PATH environment variable which they want to take precedence over autocd. It has nothing to do with shell script's inability to run an executable from a path without specifying either ./ or /. Commented Oct 12, 2016 at 22:48
  • The first link to the readme does not work. Here it is. Furthermore, the OMZ lib directory has nothing todo with plugins.Regarding the question and as you said, the correct command is unsetopt.
    – Timo
    Commented Oct 23, 2017 at 8:14
  • This is one of the least useful technically correct answers I've ever seen. So much completely unnecessary and useless context when you could have just said "lib/theme-and-appearance.zsh is responsible for turning that feature on. Add unsetopt AUTO_CD to your .zshrc to disable it."
    – iono
    Commented Jun 16, 2022 at 21:55
29

This worked for me:

unsetopt autocd
2
  • 10
    This should be the accepted answer. No bullshit included.
    – Aries
    Commented May 25, 2020 at 11:21
  • If you are using oh-my-bash then shopt -u autocd command for you. Commented Mar 2, 2023 at 9:18

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .