Los programas son ejecutables ordinarios escritos en cualquier lenguaje (principalmente C).
El shell toma un comando ingresado que es solo una cadena. Luego busca ciertas secuencias de caracteres que tienen un significado especial para el shell, como las variables ambientales que son $ seguido de una palabra o redirecciones que son > seguido de un camino. Después de que se haya realizado esta sustitución, tiene una cadena que se divide en espacios para generar un nombre de un ejecutable y parámetros. El shell luego buscará el ejecutable en la lista de directorios en la variable ambiental PATH. Luego, el shell usa llamadas al sistema para crear un proceso a partir del ejecutable con los parámetros.
Por ejemplo para ejecutar el comando ls $HOME el shell primero reconocería que $HOME es una variable ambiental y la sustituimos por su valor en este caso /home/user dejando el comando ls /home/user . Luego divide el comando en el espacio para obtener el nombre del ejecutable ls y parámetro /home/user . El shell encuentra el primer ejecutable que coincide con ls normalmente /bin/ls . A continuación, utiliza las llamadas al sistema spawn()/ posix_spawn() o fork() y exec() para crear el nuevo proceso.
La mayoría de las utilidades básicas de Linux están escritas en C .Esto lo puedes verificar en busybox source code que admite la mayoría de las utilidades de comando básicas de Linux que están escritas en C .Entonces, comandos como ls, cd ... etc. están en c
Cómo interpretará Shell el enlace a continuación
en un sistema operativo hay un programa especial llamado shell. El shell acepta comandos legibles por humanos y los traduce a algo que el kernel puede leer y procesar.
http://www.math.iitb.ac.in/resources/manuals/Unix_Unleashed/Vol_1/ch08.htm
Estos programas están escritos principalmente en el lenguaje de programación C, al igual que el kernel de Linux.