简体   繁体   中英

Location of cd executable

I read that the executables for the commands issued using exec() calls are supposed to be stored in directories that are part of the PATH variable.

Accordingly, I found the executables for ls, chmod, grep, cat in /bin.

However, I could not find the executable for cd .

Where is it located?

A process can only affect its own working directory. When an executable is executed by the shell it executes as a child process, so a cd executable (if one existed) would change that child process's working directory without affecting the parent process (the shell), hence the cd command must be implemented as a shell built-in that actually executes in the shell's own process.

cd is a shell built-in, unfortunately.

$ type cd
cd is a shell builtin

...from http://www.linuxquestions.org/questions/linux-newbie-8/whereis-cd-sudo-doesnt-find-cd-464767/

But you should be able to get it working with:

sh -c "cd /somedir; do something"

Not all utilities that you can execute at a shell prompt need actually exist as actual executables in the filesystem. They can also be so-called shell built-ins , which means – you guessed it – that they are built into the shell.

The Single Unix Specification does, in general, not specify whether a utility has to be provided as an executable or as a built-in, that is left as a private internal implementation detail to the OS vendor.

The only exceptions are the so-called special built-ins , which must be provided as built-ins, because they affect the behavior of the shell itself in a manner that regular executables (or even regular built-ins) can't (for example set , which sets variables that persist even after set exits). Those special built-ins are:

  • break
  • :
  • continue
  • .
  • eval
  • exec
  • exit
  • export
  • readonly
  • return
  • set
  • shift
  • times
  • trap
  • unset

Note that cd is not on that list, which means that cd is not a special built-in. In fact, according to the specification , it would be perfectly legal to implement cd as a regular executable. It's just not possible, for the reasons given by the other answers.

And if you scroll down to the non-normative section of the specification, ie to the part that is not officially part of the specification but only purely informational, you will find that fact explicitly mentioned:

Since cd affects the current shell execution environment, it is always provided as a shell regular built-in .

So, the specification doesn't require cd to be a built-in, but it's simply impossible to do otherwise.

Note that sometimes utilities are provided both as a built-in and as an executable. A good example is the time utility, which on a typical GNU system is provided both as an executable by the Coreutils package and as a shell regular built-in by Bash. This can lead to confusion, because when you do man time , you get the manpage of the time executable (the time builtin is documented in man builtins ), but when you execute time you get the time built-in, which does not support the same features as the time executable whose manpage you just read. You have to explicitly run /usr/bin/time (or whatever path you installed Coreutils into) to get the executable.

According to this , cd is always a built-in command and never an executable:

Since cd affects the current shell execution environment, it is always provided as a shell regular built-in.

cd is part of the shell; an internal command. There is no binary for it.

The command cd is built-in in your command line shell. It could not affect the working directory of your shell otherwise.

I also searched the executable of "cd" and there is no such. You can work with chdir (pathname) in C, it has the same effect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM