187

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

4
  • 1
    Visit for example: ftp.gnu.org/pub/gnu/coreutils You can browse the code online. Open one of the archives and check for the src folder. Commented Jul 17, 2012 at 18:07
  • Hi, I find an utilities too, it is util-linux. You can find it here Commented Dec 16, 2014 at 9:10
  • 1
    ls is not part of Linux, it is part of Gnu. Gnu runs on Linux and other kernels. Commented Aug 31, 2017 at 17:19
  • 4
    I find github interface easier for reading code, github.com/coreutils/coreutils/blob/master/src/ls.c Commented Jun 15, 2018 at 5:28

8 Answers 8

201

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

Sign up to request clarification or add additional context in comments.

6 Comments

OMG! I thought it was a bit easier... Well the path is longer and harder than expected :-)
Try the source for cat. It's only 767 lines.
Only 4984 code lines ... -- It seems in 4 years and 3 months ls has become another 57 lines more complex.
I remember once I tried to understand why wc is so much faster than equivalent Java program. So I looked at the code ... OMG is it optimized for disk reads, buffering inputs, etc or what :)
@yǝsʞǝlA I'm not proficient in C; how do you tell what it's optimizing for? Can you give me an example?
|
155

Direct links to source for some popular programs in coreutils:

Full list here.

3 Comments

Do you have su?
@Drew, do you have any idea if there are shell commands actually written in shell script?
I don't see the find command in here like find . -type f -name '*.csproj' I am trying to see how that algorithm looks
7

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 -

http://git.suckless.org/sbase/file/ls.c.html

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

Comments

6

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.

1 Comment

3

You can have it on github using the command

git clone https://github.com/coreutils/coreutils.git

You can find all the source codes in the src folder.

You need to have git installed.

Things have changed since 2012, ls source code has now 5309 lines

Comments

1

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

2 Comments

Is this resource official or a third party repository?
@Merlin: it is official
0

BSD distributions are actually a nice way of reading the source code, by using their repositories, since it is all packed into one place, and you can view how historically the source code has evolved, or changed. So why not use BSD repos , such as NetBSD or OpenBSD for this task.

Comments

-1
    cd ~ && apt-get source coreutils && ls -d coreutils*     

You should be able to use a command like this on ubuntu to gather the source for a package, you can omit sudo assuming your downloading to a location you own.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.