How do I read the source code of shell commands?

I would like to read the actual source code which the linux commands are written with. I've gained some experience using them and now I think it's time to interact with my machine at a deeper level.

I've found some commands here http://directory.fsf.org/wiki/GNU. Unfortunately I wasn't able to find basic commands such as 'ls' which seems to me easy enough to begin.

How exactly do I read the source code of the simple shell commands like 'ls'? I'm running on Ubuntu 12.04


Solution 1:

All these basic commands are part of the coreutils package.

You can find all information you need here:

http://www.gnu.org/software/coreutils/

If you want to download the latest source, you should use git:

git clone git://git.sv.gnu.org/coreutils

To install git on your Ubuntu machine, you should use apt-get (git is not included in the standard Ubuntu installation):

sudo apt-get install git

Truth to be told, here you can find specific source for the ls command:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

Only 4984 code lines for a command 'easy enough' as ls... are you still interested in reading it?? Good luck! :D

Solution 2:

Direct links to source for some popular programs in coreutils:

  • cat (767 lines)
  • chmod (570 lines)
  • cp (2912 lines)
  • cut (831 lines)
  • date (570 lines)
  • df (1718 lines)
  • du (1112 lines)
  • echo (272 lines)
  • head (1070 lines)
  • hostname (116 lines)
  • kill (312 lines)
  • ln (651 lines)
  • ls (4954 lines)
  • md5sum (878 lines)
  • mkdir (306 lines)
  • mv (512 lines)
  • nice (220 lines)
  • pwd (394 lines)
  • rm (356 lines)
  • rmdir (252 lines)
  • shred (1325 lines)
  • tail (2301 lines)
  • tee (220 lines)
  • touch (437 lines)
  • wc (801 lines)
  • whoami (91 lines)

Full list here.

Solution 3:

ls is part of coreutils. You can get it with git :

git clone git://git.sv.gnu.org/coreutils

You'll find coreutils listed with other packages (scroll to bottom) on this page.

Solution 4:

Actually more sane sources are provided by http://suckless.org look at their sbase repository:

git clone git://git.suckless.org/sbase

They are clearer, smarter, simpler and suckless, eg ls.c has just 369 LOC

After that it will be easier to understand more complicated GNU code.

Solution 5:

CoreUtils referred to in other posts does NOT show the real implementation of most of the functionality which I think you seek. In most cases it provides front-ends for the actual functions that retrieve the data, which can be found here:

It is build upon Gnulib with the actual source code in the lib-subdirectory