gen[IA]ll Tutor
LINUX-FUNDAMENTALS

Command Line

Actualizado en octubre de 2026 · 26 min de lectura

Command Line

Resumen

Esta guía de estudio independiente cubre el uso práctico de la línea de comandos en Linux con Bash y GNU Coreutils.

No es material oficial ni está afiliada a la Linux Foundation.

El enfoque es operativo: moverse por el árbol de directorios, manipular archivos, interpretar permisos, buscar contenido y gestionar procesos. Cada sección conecta la sintaxis con lo que hace el shell antes de ejecutar un programa, porque muchas confusiones provienen de esa fase de expansión.

Objetivos de aprendizaje

  • Navegar con rutas absolutas y relativas, y reconocer el directorio actual.
  • Crear, copiar, mover y eliminar archivos usando expansión de globos con criterio.
  • Leer y modificar permisos con notación simbólica y octal, incluida la umask.
  • Filtrar texto con grep y localizar archivos con find.
  • Interpretar procesos, señales y trabajos en segundo plano.
  • Consultar la ayuda de un comando y distinguir las secciones del manual.
  • Comprobar el código de salida de un programa con $? y leer su significado.
  • Mantener un trabajo vivo después de cerrar la terminal.

Prerrequisitos y conexiones

Conviene haber estudiado Linux Operating System, en especial el FHS y el papel del shell. Los permisos se relacionan con System Administration, y la búsqueda de texto aparece en Troubleshooting. Practica en un directorio temporal.

Navegación y rutas

pwd imprime el directorio de trabajo actual. Una ruta absoluta comienza en / y no depende de la ubicación del usuario; una relativa se interpreta desde el directorio actual. cd /var/log cambia a una ruta absoluta, cd .. sube un nivel y cd - vuelve al anterior. ~ representa el directorio personal, . el actual y .. el padre.

ls lista nombres y sus opciones cambian la información mostrada. -l usa formato largo; -a incluye entradas ocultas; -h hace legibles los tamaños; -t ordena por fecha. La finalización con Tab reduce errores, pero verifica la ruta con pwd antes de operar.

pwd
cd /var/log
cd -
ls -lah
ls -lt /etc | head

El formato largo lleva más columnas de las que parecen: después de los permisos, la cifra siguiente indica el número de enlaces duros, luego aparecen propietario y grupo, y la fecha corresponde a la última modificación. Un directorio recién creado muestra 2 porque cuenta la entrada del propio directorio y la que el padre mantiene hacia él, y ese contador sube con cada subdirectorio creado dentro.

Ordenar por tamaño exige -S, que combina con -h para leer los sufijos: ls -lhS presenta primero los archivos que más pesan en el directorio actual.

Archivos, directorios y expansión del shell

touch crea un archivo vacío o actualiza su fecha; mkdir -p crea una ruta completa sin fallar si los directorios intermedios existen. cp copia y mv mueve o renombra; cp -r copia un árbol. rm elimina archivos y rm -r directorios con su contenido, sin papelera recuperable. Antes de borrar, revisa la expansión con echo o ls y considera rm -i.

El shell expande globos antes de ejecutar el comando. * coincide con cualquier cadena, ? con un carácter y [0-9] con un dígito. Por eso rm *.tmp puede afectar más archivos de los previstos. Las llaves generan combinaciones: cp informe.txt{,.bak} produce cp informe.txt informe.txt.bak. Las comillas simples evitan toda expansión; las dobles permiten variables, pero no globos.

mkdir -p ~/practicas/logs
touch ~/practicas/logs/{app,error}.log
cp ~/practicas/logs/app.log{,.bak}
mv ~/practicas/logs/error.log ~/practicas/logs/error-2026.log
ls -l ~/practicas/logs/*.log

Para un respaldo que deba conservar permisos, propietario y marcas de tiempo, cp -a copia en modo archivo: reproduce los atributos y crea enlaces simbólicos como tales en lugar de seguirlos, mientras que cp -r solo garantiza la estructura de directorios. En Bash, shopt -s globstar activa ** de modo que **/*.log alcance cualquier profundidad del árbol y no solo la del directorio actual.

mv dentro del mismo sistema de archivos es un renombre: cambia la entrada de directorio sin copiar datos. Cuando cruza dos sistemas distintos, la orden copia y después borra el origen, por eso puede fallar por espacio o tardar mucho en archivos grandes mientras que un renombre local termina al instante.

Permisos y propiedad

Cada archivo tiene propietario, grupo y permisos para usuario, grupo y otros. En -rw-r--r--, el primer carácter indica el tipo; luego aparecen lectura (r), escritura (w) y ejecución (x) por conjunto. En un directorio, r permite listar nombres, w crear o borrar entradas y x atravesarlo. Sin x no se accede a un archivo interior aunque se conozca su ruta.

chmod acepta notación simbólica (u+x, g-w, o=r) y octal (640, 755). chown usuario:grupo archivo cambia propietario y grupo; normalmente solo root cambia el propietario. La umask retira permisos a archivos y directorios nuevos: con umask 027, un archivo de base 666 queda en 640. Setgid en un directorio hace que los archivos nuevos hereden su grupo; sticky en /tmp impide que un usuario borre archivos de otro.

chmod u+x respaldo.sh
chmod 640 informe.txt
chown ana:dev informe.txt
umask
umask 027
ls -ld /tmp

La traducción de cada octal a permisos se vuelve automática con la tabla siguiente, donde las tres posiciones son siempre propietario, grupo y otros:

ModoUsuarioGrupoOtrosCaso típico
700rwx------directorio personal y claves privadas
750rwxr-x---binario de un equipo concreto
755rwxr-xr-xprograma instalado para todos
600rw-------archivo confidencial de una cuenta
640rw-r------configuración compartida en un grupo
644rw-r---r---fichero de solo lectura para el resto

Los directorios nuevos parten de 777, así que la misma umask 027 deja cada directorio en 750: su grupo puede listar y entrar, pero no escribir. El valor de la umask pertenece al proceso que la fija, y por eso cambiarla en la terminal personal no afecta a los servicios, que arrancan con la suya propia.

Cuando el esquema propietario-grupo-otros se queda corto, las listas de control de acceso añaden entradas por usuario sin tocar el propietario: getfacl archivo las muestra y setfacl -m u:ana:r archivo concede lectura a una cuenta concreta. El carácter + que aparece en el campo de permisos de ls -l indica que el archivo tiene ACL.

Búsqueda, filtrado y redirección

grep busca patrones en texto. -i ignora mayúsculas, -n muestra el número de línea, -v invierte la selección y -r recorre directorios; -E habilita expresiones regulares extendidas. Un globo del shell no es una expresión regular: *.log lo expande Bash, mientras que grep 'error.*timeout' interpreta el patrón. Las comillas evitan que el shell lo modifique.

find recorre el árbol y filtra por metadatos. -type f limita a archivos, -name compara el nombre con un globo, -mtime -7 selecciona modificados en los últimos siete días y -size +100M los mayores de 100 MB. -exec ejecuta un comando por resultado; {} representa el archivo y + agrupa argumentos. Para nombres con espacios, -print0 con xargs -0 evita la separación incorrecta.

La redirección conecta descriptores. > sobrescribe la salida estándar, >> la añade, 2> redirige errores y &> ambos. La tubería | conecta la salida de un comando con la entrada del siguiente. Un pipeline puede contar errores repetidos y ordenarlos.

grep -in "timeout" /var/log/app.log
find /var/log -type f -name "*.log" -mtime -7
grep -i "error" /var/log/app.log | sort | uniq -c | sort -rn | head
find /tmp -type f -name "*.tmp" -print0 | xargs -0 rm --

Redirección completa de descriptores

< entrega un archivo como entrada estándar: wc -l < informe.txt cuenta líneas sin añadir el nombre a la salida, cosa que sí hace wc -l informe.txt. La orden 2>&1 duplica el descriptor de error sobre el de salida y su posición manda: en comando > registro.log 2>&1 las dos corrientes acaban en el archivo, mientras que comando 2>&1 > registro.log deja el error en la terminal y solo la salida normal en el archivo.

Un here-document, escrito como <<EOF, convierte varias líneas escritas en la sesión en la entrada estándar de un comando y permite generar un archivo corto sin abrir un editor. tee actúa en el punto intermedio de una tubería: escribe la entrada en un archivo y la sigue pasando por la salida, con la opción -a para añadir en lugar de sobrescribir.

set -o noclobber protege los archivos ya existentes: mientras esté activa, > falla en vez de truncar un registro por descuido, y set +o noclobber devuelve el comportamiento habitual.

wc -l < /var/log/app.log
grep -c "ERROR" /var/log/app.log > errores.txt 2>&1
grep "INFO" /var/log/app.log | tee -a info.txt | wc -l
set -o noclobber

Cada programa devuelve un entero al terminar y $? conserva ese código, con 0 como éxito. En una tubería solo sobrevive el estado de la última etapa, así que grep patron archivo | wc -l devuelve el recuento y oculta el 1 de grep; esa reserva significa «sin coincidencias» y no debe confundirse con el 2, que indica un fallo real de ejecución.

Selección de columnas y texto estructurado

GNU Coreutils resuelve el texto con herramientas cortas que se combinan en tuberías, y cada una cubre un problema distinto:

HerramientaQué seleccionaEjemplo
cutcolumnas delimitadascut -d: -f1 /etc/passwd
sortorden lexicográfico o numéricosort -t, -k2 -n informe.csv
uniqlíneas contiguas idénticasuniq -d duplicados.txt
sedsustituciones por expresiónsed 's/AVISO/INFO/' app.log
awkcampos con separador propioawk -F: '{print $1}' /etc/passwd
wcrecuento de líneas, palabras y byteswc -l app.log

uniq solo compara líneas contiguas, y por eso casi siempre va precedido de sort: sin ordenar, dos coincidencias separadas por otras entradas pasan desapercibidas y ni se agrupan ni se cuentan.

cut -d: -f1 /etc/passwd | sort | head
sed 's/AVISO/INFO/' app.log | head -n 5
awk -F: '$7 ~ /bash$/ {print $1}' /etc/passwd

Ayuda y documentación en la terminal

comando --help devuelve el resumen de opciones en una página estrecha, adecuada para recordar una bandera concreta, y man comando muestra la página completa con descripción, argumentos, valores por defecto y archivos relacionados. Salir del visor se hace con q.

Las secciones del manual separan contenidos que comparten nombre: la 1 reúne programas de usuario, la 5 describe formatos de archivo —man 5 passwd explica el contenido de /etc/passwd— y la 8 recoge órdenes de administración. man man explica esa numeración.

Cuando solo queda la idea suelta de una palabra, man -k patron busca en las descripciones de todas las páginas instaladas, con el mismo efecto que apropos, y whatis nombre devuelve su línea de resumen. Ambas consultas leen la base local de páginas, así que funcionan sin conexión.

ls --help | head -n 12
man 5 passwd
man -k "file permissions"
whatis umask

Procesos, trabajos y señales

ps aux muestra procesos de todos los usuarios con CPU, memoria, PID y comando; ps -ef ofrece una vista con PPID. pgrep nombre busca por nombre y top ordena por consumo en tiempo real. Un proceso lanzado con & queda en segundo plano; jobs lista esos trabajos, fg los trae al primer plano y bg reanuda uno detenido. Ctrl+C envía SIGINT y Ctrl+Z suspende con SIGTSTP.

kill no elimina un proceso: envía una señal. Sin opción usa SIGTERM, que solicita una terminación ordenada y puede capturarse. SIGKILL (-9) no puede ignorarse, pero impide cerrar archivos o liberar recursos; úsalo tras comprobar que SIGTERM no funcionó. kill -l lista las señales. nice inicia un proceso con menor prioridad y renice ajusta uno existente.

ps aux | grep "[n]ginx"
pgrep -a sshd
sleep 300 &
jobs -l
kill -TERM 4242
kill -l

Estados, zombies y carga

La columna STAT de ps condensa el estado actual: R significa en ejecución o listo, S duerme esperando un evento, D espera una operación de E/S sin poder interrumpirse con señales, T está detenido y Z identifica un zombie. Un zombie ya terminó, pero su padre no ha recogido su código de salida, de modo que solo ocupa una fila en la tabla de procesos.

En ps aux, VSZ es la memoria virtual reservada y RSS la porción residente en RAM; únicamente la segunda refleja el consumo real, porque la primera incluye páginas compartidas y bibliotecas mapeadas que no se cargan por completo.

La carga media que informa uptime es el promedio de procesos en ejecución o bloqueados esperando E/S durante el último minuto, los últimos cinco y los últimos quince; un valor que se sostiene por encima del número de núcleos indica saturación y no coincide necesariamente con el uso de CPU que muestra top.

ps -o pid,stat,etime,cmd -p $$
ps aux --sort=-%mem | head -n 6
uptime

Trabajos que sobreviven a la sesión

Al cerrar la terminal, los procesos en segundo plano reciben SIGHUP y mueren con ella. nohup comando > salida.log 2>&1 & hace que el programa ignore esa señal y desvía su salida a un archivo, mientras que disown retira de la tabla de trabajos un programa ya lanzado; las dos rutas impiden que el cierre de la sesión termine el encargo.

SIGHUP tiene además otro uso habitual: muchos demonios la reciben al descolgar y la interpretan como orden de recargar su configuración. SIGSTOP detiene un proceso de forma que no puede capturarse y SIGCONT lo reanuda. pkill nombre localiza por nombre y pkill -f patron compara la línea de comandos completa, con el riesgo de terminar procesos que solo comparten ese texto.

Ejemplos prácticos

Un servicio responde con errores intermitentes y el equipo necesita evidencia antes de reiniciarlo. Se filtran las líneas relevantes, se cuentan los mensajes repetidos y se revisan los procesos asociados. El pipeline no modifica el registro.

grep -i "status=500" /var/log/nginx/access.log | wc -l
grep -i "status=500" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
ps -eo pid,ppid,pcpu,pmem,cmd --sort=-pcpu | head

Si el problema es de espacio, find /var/log -type f -size +100M localiza archivos grandes antes de rotarlos. Si dos personas deben editar un archivo compartido, se ajusta el grupo y su permiso en lugar de abrirlo a todos. En ambos casos, valida primero con una versión que solo muestre resultados.

Otro caso: hay que explicar qué pesa más en un directorio de datos y qué ha cambiado en él recién, sin modificar nada. Se mide, se ordena y se acota por fecha antes de proponer una limpieza.

du -sh ~/practicas/* | sort -h | tail -n 5
find ~/practicas -type f -mtime -1
df -h .

sort -h entiende los sufijos de tamaño, df -h . comprueba el espacio del sistema de archivos que contiene el directorio actual y -mtime -1 limita la búsqueda a las últimas veinticuatro horas.

Cuando el fallo es de permisos, se inspecciona cada eslabón de la ruta y se confirma la identidad real de la sesión antes de culpar al archivo final:

id
ls -ld / /srv /srv/datos /srv/datos/reporte.txt

Los grupos recién asignados con usermod -aG no se aplican hasta volver a entrar, así que una comprobación hecha en la misma sesión en que se concedió el permiso muestra siempre la situación anterior.

Errores frecuentes

  • Usar chmod 777 para resolver un permiso: elimina el aislamiento y no corrige la causa.
  • Ejecutar rm -rf con una variable vacía o un globo amplio sin revisar la expansión.
  • Confundir > con >> y truncar un registro.
  • Pasar un globo a grep o find sin comillas y obtener una expansión inesperada.
  • Enviar SIGKILL de inmediato en lugar de probar SIGTERM.
  • Cambiar el propietario de forma recursiva sin considerar enlaces simbólicos y archivos del sistema.
  • Terminar un proceso con Ctrl+Z y olvidarse de él: queda detenido y ocupa una ranura de trabajo.
  • Redirigir la salida de error a /dev/null mientras se diagnostica y perder la evidencia del fallo.
  • Esperar que la umask de la sesión personal alcance a los servicios de systemd.
  • Usar ls suponiendo que el orden refleja el tamaño, cuando por defecto sigue el alfabeto.
  • Dar por fallido un grep sin resultados, que devuelve 1 y no 2.

Puntos clave para el examen

Distingue rutas absolutas de relativas y recuerda que el shell expande globos antes de ejecutar. Asocia r, w y x con sus efectos en archivos y directorios, y convierte entre notación simbólica y octal. Diferencia > de >> y la salida estándar de la de error. Reconoce opciones de grep y find, y el papel de -exec frente a xargs. En procesos, identifica PID, la señal predeterminada de kill y la diferencia entre SIGTERM y SIGKILL.

Añade el comportamiento que más se olvida: $? refleja el estado del último programa y, en una tubería, el de su última etapa; set -o noclobber evita truncar por accidente; uniq necesita un sort previo; la umask de la sesión no gobierna a los servicios. En el día a día, ps -o pid,stat,etime revela procesos detenidos o zombies, du -sh | sort -h ordena tamaños legibles, man -k y whatis recuperan el nombre de una herramienta y id confirma los grupos reales antes de dar por mal un permiso.

Recursos externos

Autoevaluación

  1. ¿Qué diferencia hay entre > y >>?
    > trunca el archivo antes de escribir; >> añade al final sin borrar el contenido.

  2. ¿Qué permiso necesita un directorio para acceder a un archivo contenido?
    Ejecución (x) para atravesarlo; la lectura (r) solo permite listar nombres.

  3. ¿Qué hace chmod 640 archivo?
    Lectura y escritura para el propietario, lectura para el grupo y nada para otros.

  4. ¿Cuándo conviene -print0 con xargs -0?
    Cuando los nombres pueden contener espacios o caracteres especiales; así se separan por byte nulo.

  5. ¿Por qué es preferible SIGTERM antes que SIGKILL?
    Porque SIGTERM permite cerrar archivos y liberar recursos ordenadamente; SIGKILL termina sin esa oportunidad.

  6. ¿Qué informa echo $? inmediatamente después de un comando?
    El código de salida del programa anterior: 0 es éxito, el 1 de grep significa sin coincidencias y el 2 un fallo de ejecución.

  7. ¿Qué protección añade set -o noclobber?
    Impide que > sobrescriba un archivo que ya existe, de modo que un fallo de escritura no destruye el registro; se revierte con set +o noclobber.

  8. ¿Qué significa la letra Z en la columna STAT de ps?
    Que el proceso es un zombie: terminó, pero su padre no ha recogido el código de salida y la fila sigue ocupada.

  9. ¿Cómo sigue vivo un trabajo tras cerrar la terminal?
    Lanzándolo con nohup para que ignore SIGHUP y con la salida desviada a un archivo, o con disown si ya estaba en segundo plano.

  10. ¿Qué cambia respecto a ps aux la vista ps -ef?
    Ofrece el formato System V con el PID del padre explícito y sin las columnas de consumo de CPU y memoria.