rtfmp    Archive

Where do commands in Linux come from?

When I started learning Linux, I knew there were two types of command- shell builtin and external executables. Shell builtin are built into the shell and executables are binaries that are independent of the shell. But I never really thought for a long time where do the commands come from.

Some commands come from their own package whereas in some cases a single package would pack a bunch of commands. To find the type of a command, I use the type command.

[rtfmp@centos7 ~]$ type cd
cd is a shell builtin
[rtfmp@centos7 ~]$ type find
find is /usr/bin/find
[rtfmp@centos7 ~]$

If it is a shell builtin it tells me so. If it is not, it tells me the path where the command is stored. I could also use which, whereis and locate to find the path of a command. My preferred way is which.

[rtfmp@centos7 ~]$ which find
/usr/bin/find
[rtfmp@centos7 ~]$ whereis find
find: /usr/bin/find /usr/share/man/man1/find.1.gz
[rtfmp@centos7 ~]$ locate find
/usr/bin/find
/usr/bin/findmnt
/usr/bin/oldfind
/usr/lib64/python2.7/modulefinder.py
...

Now I know where the command is stored, how do I find from which package it comes from? Use rpm -qf in CentOS

[rtfmp@centos7 ~]$ rpm -qf `which find`
findutils-4.5.11-3.el7.x86_64

and dpkg -S in Ubuntu.

brm@bacer:~$ dpkg -S `which find`
findutils: /usr/bin/find

The Yum equivalent is yum provides.

    [rtfmp@centos7 ~]$ yum provides find
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirror.nbrc.ac.in
     * extras: mirror.digistar.vn
     * updates: mirror.nbrc.ac.in
    1:findutils-4.5.11-3.el7.x86_64 : The GNU versions of find utilities (find and
                                    : xargs)
    Repo        : base
    Matched from:
    Filename    : /usr/bin/find
    
    
    
    1:findutils-4.5.11-3.el7.x86_64 : The GNU versions of find utilities (find and
                                    : xargs)
    Repo        : @anaconda
    Matched from:
    Filename    : /usr/bin/find
    
    
    
    [rtfmp@centos7 ~]$

I haven’t found an exact equivalent for apt-get but apt-file search is close.

Since we have found which package provides the find command which is findutils, lets check if this package has other commands or binaries.

    [rtfmp@centos7 ~]$ rpm -ql findutils | grep bin
    /usr/bin/find
    /usr/bin/oldfind
    /usr/bin/xargs
    [rtfmp@centos7 ~]$

This tells xargs comes from the same package as find. I was not aware of this in spite of using Linux for a few good years.

The Debian\Ubuntu way would be

    brm@bacer:~$ dpkg -L findutils | grep bin
    /usr/bin
    /usr/bin/oldfind
    /usr/bin/find
    /usr/bin/xargs
    brm@bacer:~$

Two packages that would be worth inspecting are coreutils and util-linux also called util-linux-ng in some version. A lot of commands that we use on a daily basis come from these two packages. The following output gives us a brief idea of how many binaries are packed with them.

    [rtfmp@centos7 ~]$ rpm -ql coreutils | grep bin | wc -l
    102
    [rtfmp@centos7 ~]$

    brm@bacer:~$ dpkg -L coreutils | grep bin | wc -l
    107
    brm@bacer:~$

I hope it’s been interesting to you and thank you for reading.