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