Inicio·Comandos de terminal

Referencia de comandos de terminal

227 comandos con las opciones que de verdad se usan y un ejemplo de cada uno

⌨️ Los comandos y las opciones se escriben tal cual, así que no se traducen: solo las explicaciones cambian de idioma.

Archivos y directorios32

Mover, borrar y buscar. Algunos no preguntan dos veces, y por eso -i se vuelve costumbre.

lsMuestra el contenido de un directorio; los nombres que empiezan por punto no aparecen hasta que añades -a.cdCambia el directorio actual del shell; al ser una orden interna, un cd dentro de un script o subshell no mueve tu shell exterior.pwdImprime el directorio actual; si entraste por un enlace simbólico muestra la ruta del enlace, y solo -P da la real.mkdirCrea un directorio; sin -p falla tanto si falta un directorio padre como si ya existe.rmdirBorra un directorio solo si está vacío; si hay algo dentro se niega, y por eso se acaba usando rm -r.rmBorra archivos definitivamente: no hay papelera, y un espacio de más en rm -rf destruye lo que no querías.cpCopia archivos o árboles enteros; que el destino exista o no decide si el origen toma ese nombre o entra dentro.mvRenombra o mueve; sin -i ni -n sobrescribe el destino sin avisar.touchActualiza las fechas de un archivo y lo crea vacío si no existe; nunca cambia el contenido.catImprime archivos uno tras otro; lo vuelca todo de golpe, así que los archivos largos piden less y en cat file | grep sobra una tubería.lessRecorre un archivo página a página sin cargarlo entero; / busca y q sale, y a diferencia de more no se cierra solo al final.headImprime el principio de un archivo; con varios archivos intercala un encabezado por cada uno salvo que uses -q.tailMuestra el final de un archivo y lo sigue con -f; solo -F vuelve a abrirlo tras una rotación de logs.findRecorre un árbol probando cada entrada; entrecomilla el patrón como -name '*.log' o el shell lo expande antes de que find lo vea.locateConsulta un índice ya creado en vez del disco: responde al instante, pero no ve los archivos creados tras el último updatedb.treeDibuja la estructura de directorios como un árbol indentado; no viene instalado por defecto en macOS ni en imágenes Linux mínimas.duSuma el espacio en disco que los archivos ocupan de verdad; cuenta bloques asignados, así que su total difiere de la suma de tamaños y de df.dfInforma del espacio usado y libre por sistema de archivos; un disco puede quedarse sin inodes aunque sobren bytes, y solo df -i lo muestra.lnDa otro nombre a un archivo; un enlace simbólico con -s puede apuntar a cualquier sitio pero se rompe si el destino cambia, y una ruta relativa se lee desde el directorio del enlace.statMuestra el registro del inode: tamaño, permisos, propietario y las tres fechas; el formato es -c en GNU y -f en BSD, mientras que en GNU -f significa algo distinto.fileDetermina el tipo de un archivo por su contenido, no por su nombre; ignora la extensión, y así se descubre un .jpg que en realidad es un PDF.basenameQuita la parte del directorio de una ruta y puede eliminar un sufijo; solo manipula texto y nunca comprueba si el archivo existe.dirnameDeja solo la parte del directorio; si no hay barra, la respuesta es un punto, y como basename solo trabaja con texto.realpathConvierte cualquier ruta en una ruta absoluta con enlaces y puntos resueltos; la versión de macOS es la de BSD, así que faltan opciones GNU como --relative-to.rsyncCopia solo las diferencias entre dos árboles, en local o por ssh; una barra final en el origen significa su contenido, y sin ella el directorio queda un nivel más adentro.mountConecta un sistema de archivos a un directorio; lo que ya había en el punto de montaje queda oculto, no borrado, y reaparece al desmontar.umountDesmonta un sistema de archivos; el nombre no lleva n, y responde device is busy mientras algún proceso tenga dentro un archivo abierto o su directorio actual.readlinkImprime a qué apunta un enlace simbólico, un solo salto salvo con -f; en un archivo que no es enlace no imprime nada y sale con error.mktempCrea un archivo o directorio temporal con un nombre imposible de adivinar e imprime su ruta; no se borra solo, así que acompáñalo de un trap al salir.sha256sumImprime la huella SHA-256 de un archivo para comprobar si la descarga llegó intacta; que coincida prueba que los bytes son iguales, no que el origen sea de fiar.truncateFija la longitud exacta de un archivo: al agrandarlo solo crea un hueco disperso sin reservar espacio, y al reducirlo descarta la cola sin avisar.shredSobrescribe los bytes antes de borrar, pero en SSD y en sistemas copy-on-write como btrfs o APFS los bloques viejos pueden sobrevivir, así que la respuesta real es cifrar el disco.

Procesado de texto32

Están hechos para encadenarse con tuberías. Tres comandos unidos suelen ser más cortos que uno que lo haga todo.

grepExtrae las líneas que casan con un patrón; usa regex básica por defecto, así que + ? | y () requieren -E o una barra invertida.sedEdita texto línea a línea, casi siempre con s/old/new/; el -i en el sitio difiere entre GNU y BSD, y sin la g final solo cambia la primera coincidencia de cada línea.awkDivide cada línea en campos y ejecuta un pequeño programa; $0 es la línea entera y $1 el primer campo, y el separador por defecto es cualquier serie de espacios, no uno solo.sortOrdena líneas; sin -n compara como texto, así que 10 va antes de 9, y el locale decide el orden salvo que pongas LC_ALL=C delante.uniqColapsa solo líneas iguales que están juntas, no duplicados repartidos por el archivo, por eso casi siempre va después de sort.wcCuenta líneas, palabras y bytes; -l cuenta saltos de línea, así que una última línea sin salto no se cuenta.cutExtrae campos fijos o posiciones de carácter; el delimitador es un solo carácter y los repetidos no se fusionan, así que las columnas alineadas con espacios son cosa de awk.pastePega archivos uno al lado del otro con un tabulador entre ellos; a diferencia de join empareja por posición y no mira el contenido.trSustituye o borra caracteres uno a uno; solo lee la entrada estándar, así que pasarle un nombre de archivo falla y hay que redirigir con < o usar una tubería.joinUne dos archivos por un campo común como un join de base de datos; ambos deben estar ya ordenados por ese campo o se pierden líneas en silencio.commCompara dos archivos ordenados y muestra tres columnas: solo el primero, solo el segundo y ambos; si no están ordenados el resultado no sirve, y las opciones ocultan columnas en vez de elegirlas.diffMuestra qué cambió entre dos archivos; el formato unificado -u es el que esperan patch y la revisión de código, y sale con 1 si difieren, lo que detiene un script con set -e.patchAplica un diff a los archivos; -p decide cuántos componentes de ruta se descartan, y un diff de git necesita -p1 por sus prefijos a/ y b/.teeCopia su entrada a un archivo y a la pantalla a la vez; es la forma de escribir en un archivo de root, porque en sudo cmd > file la redirección la abre tu propio shell.xargsConvierte líneas de entrada en argumentos de otra orden; los nombres con espacios lo rompen salvo que ambos lados usen NUL, es decir find -print0 con xargs -0.echoImprime sus argumentos y un salto de línea; -e y el trato de las barras invertidas varían según el shell, así que printf es la opción portable.printfDa formato al texto con una plantilla igual que el printf de C; no añade salto de línea y repite la plantilla mientras queden argumentos.jqFiltra y reorganiza JSON con su propio mini lenguaje; a menudo no viene instalado, y -r es lo que quita las comillas de las cadenas.columnRellena los campos para alinear las columnas como una tabla; los separadores repetidos cuentan como uno, así que un CSV con celdas vacías sale desplazado.foldCorta las líneas largas a un ancho fijo insertando saltos de línea reales; sin -s parte palabras por la mitad y, a diferencia del ajuste visual del terminal, cambia el contenido.nlNumera las líneas al imprimirlas; por defecto se salta las vacías, y por eso sus números no cuadran con el editor hasta que usas -b a.revInvierte los caracteres de cada línea, no el orden de las líneas: eso lo hace tac.splitParte un archivo en trozos; la fila de encabezado queda solo en el primero, y los nombres acaban en aa, ab salvo que uses -d para numerarlos.csplitCorta un archivo donde aparece un patrón, no a un tamaño fijo; los números que imprime son bytes, y {*} significa repetir tantas veces como coincida.expandConvierte tabuladores en espacios; un Makefile necesita tabuladores reales, así que pasarle expand rompe la compilación.shufDevuelve las líneas en orden aleatorio; es de GNU coreutils y no existe en macOS, donde el sustituto sort -R agrupa las líneas iguales.tacImprime las líneas de un archivo de la última a la primera; es de GNU coreutils, en macOS se usa tail -r, y no es rev, que invierte caracteres.stringsExtrae texto imprimible de un binario; recoge todo lo que parece texto, así que la mayor parte del resultado es casualidad, no significado.iconvConvierte texto de una codificación a otra; se detiene en el primer byte que no puede mapear salvo con -c, y no adivina la codificación de entrada.vimUn editor modal: escribir no hace nada hasta que pulsas i, y sales con Esc y luego :wq para guardar o :q! para descartar.nanoUn editor sencillo a pantalla completa con las órdenes escritas abajo; el acento circunflejo de ^O y ^X significa Ctrl, no un carácter literal.base64Convierte bytes en texto ASCII y de vuelta para que lo binario pase por canales de solo texto; es codificación, no cifrado, y decodificar es -d en GNU pero -D en macOS antiguo.

git45

Lo confuso es que deshacer tiene varias formas: mover a dónde apunta una rama no es lo mismo que añadir un commit que la revierte.

git initConvierte una carpeta en un repositorio git nuevo; init por sí solo no rastrea nada, aún hacen falta add y commit.git cloneCopia un repositorio remoto con su historia; un clon con --depth 1 no trae commits antiguos ni otras ramas, y luego hace falta --unshallow.git configLee y escribe la configuración de git; sin --global solo afecta a este repositorio, por eso un clon nuevo no la conoce.git init --bareCrea un repositorio sin árbol de trabajo, pensado solo para recibir push; no puedes editar archivos dentro, pero ningún push choca con una rama activa.git addPrepara el archivo tal como está en ese instante; si lo editas después del add, ese cambio no entra y hay que volver a añadirlo.git commitRegistra lo preparado como un commit; -a solo toma archivos ya rastreados, así que los nuevos quedan fuera.git statusMuestra qué está preparado, cambiado o sin rastrear; los archivos nuevos se agrupan por carpeta salvo que añadas -uall.git diffMuestra solo los cambios que aún no has preparado; por eso parece vacío justo después de git add: usa --staged.git logLista el historial del más nuevo al más viejo, pero solo los antecesores del HEAD actual: otras ramas requieren --all.git showImprime un commit con su mensaje y su diff; la forma <commit>:<ruta> saca una versión antigua del archivo sin tocar tu copia de trabajo.git blameMarca cada línea con el commit que la cambió por última vez; un reformateo oculta al autor real, y para eso están -w y --ignore-rev.git branchLista, crea y borra ramas en local; borrar una no toca la del remoto, el servidor aún necesita git push origin --delete.git checkoutEl comando antiguo que cambia de rama y restaura archivos, dividido en switch y restore en git 2.23; checkout -- <archivo> borra para siempre los cambios sin commit.git switchEl comando de git 2.23 que solo cambia de rama; nunca reescribe el contenido de los archivos, para eso está restore.git restoreEl comando de git 2.23 para devolver el contenido de un archivo; por defecto sobrescribe tu archivo y los cambios sin commit desaparecen, mientras --staged solo quita del área de preparación.git mergeTrae el trabajo de otra rama a la actual; --squash no registra una fusión, así que git sigue considerando esa rama sin fusionar.git rebaseReaplica tus commits sobre otra base; los hashes cambian, así que nunca rebases una rama que otros ya descargaron: allí se usa merge.git resetMueve el puntero de la rama a otro commit: --soft deja todo preparado, --mixed (por defecto) además vacía el área de preparación pero conserva tus cambios en los archivos, y --hard también los destruye sin recuperación.git revertDeshace un commit añadiendo otro commit contrario; no borra la historia, a diferencia de reset que mueve el puntero, así que lo ya publicado se deshace con revert.git cherry-pickCopia un solo commit a la rama actual como un commit nuevo con otro hash, por lo que al fusionar esa rama luego el mismo cambio puede aparecer dos veces.git stashAparta los cambios sin terminar y te deja el árbol limpio; los archivos sin rastrear se quedan salvo con -u, y pop borra la entrada mientras apply la conserva.git cleanBorra archivos sin rastrear, de los que git nunca tuvo copia, así que no vuelven; -fdx además elimina los ignorados como un .env local, ejecuta -n antes.git remoteGestiona los nombres y las URL de los repositorios remotos; solo los apunta, nada viaja hasta que haces fetch o push.git fetchDescarga los commits nuevos sin tocar tus archivos ni tu rama, así que aún falta un merge o rebase, y las ramas borradas en el servidor siguen ahí hasta --prune.git pullEjecuta fetch y merge de una vez, de ahí vienen los commits de fusión inesperados; --rebase o --ff-only lo evita.git pushEnvía tus commits a un remoto; --force sobrescribe la rama remota y puede borrar commits de otros, así que usa --force-with-lease, que se niega si el remoto cambió.git tagPone un nombre, como una versión, en un commit; un git push normal no lleva las etiquetas, hay que empujar la etiqueta por su nombre.git rmQuita un archivo del índice y del disco; --cached lo conserva y solo deja de rastrearlo, pero el contenido antiguo permanece en la historia, así que un secreto filtrado sigue ahí.git mvMueve un archivo y prepara el cambio en un paso; git no guarda renombrados, los deduce por la similitud del contenido, y un cambio solo de mayúsculas necesita -f en macOS y Windows.git ls-filesLista rutas del índice, no del disco, y por eso es la lista fiable para un script; -i no funciona solo y exige -c u -o junto con --exclude-standard.git update-indexModifica el índice directamente; las marcas son locales y nunca se envían, y la que conserva tus cambios locales en un archivo de configuración es --skip-worktree, no --assume-unchanged.git sparse-checkoutAñadido en git 2.25, mantiene en disco solo los directorios que nombras; la historia sigue completa y el modo cone acepta nombres de directorio, no patrones glob.git reflogRecuerda todas las posiciones que han tenido HEAD y tus ramas, y ahí aparecen los commits perdidos por reset --hard o una rama borrada; las entradas caducan a los 90 días y solo existen en tu máquina.git bisectVa partiendo el rango de commits en dos para encontrar el primero defectuoso; hay que terminar con git bisect reset, o te quedas en un commit desprendido.git describeNombra el commit actual a partir de la etiqueta más cercana, como v1.2.0-5-gabc1234; por defecto solo ve etiquetas anotadas, así que las ligeras necesitan --tags y un repositorio sin etiquetas necesita --always.git rev-parseConvierte un nombre como HEAD o v1.2.0^ en un hash real y dice dónde está el repositorio; los scripts obtienen la rama con --abbrev-ref HEAD, y fuera de un repositorio termina con error.git fsckRevisa la base de objetos y enumera commits a los que nada apunta: la segunda forma de recuperar trabajo perdido tras un reset cuando ya no hay reflog; informa, no repara.git gcEmpaqueta objetos sueltos y descarta los inalcanzables para reducir .git; --prune=now también tira los commits que sostenía el reflog, y con eso desaparece la red de seguridad para deshacer un reset.git archiveExporta los archivos de un commit como tar o zip; deja fuera .git y los archivos sin rastrear, así el paquete de release sale más limpio que comprimir la carpeta.git applyAplica un archivo diff a tu árbol de trabajo; no crea commit ni lee el autor del parche, por eso los parches recibidos por correo se aplican con am.git amConvierte parches de correo en commits conservando autor y mensaje originales; si falla se detiene a mitad de la serie, y hay que cerrarla con --continue, --skip o --abort.git format-patchEscribe un archivo .patch con formato de correo por cada commit; format-patch main significa los commits posteriores a main, no main mismo.git shortlogAgrupa los commits por autor y los cuenta, útil para notas de versión; una persona con dos direcciones cuenta doble salvo que un .mailmap las una.git worktreeSaca una segunda carpeta de trabajo del mismo repositorio para trabajar en dos ramas a la vez sin clonar otra copia; la misma rama no puede estar en dos, y borrar la carpeta a mano deja una entrada hasta prune.git submoduleFija otro repositorio en un commit dentro del tuyo; un clon normal deja la carpeta vacía hasta update --init, y el padre apunta a un commit, no a una rama.

Procesos y sistema36

Qué se está ejecutando y qué se come la máquina. Identificarlo va antes de matarlo.

psToma una foto puntual de los procesos en marcha; `ps aux` es la forma BSD sin guion y `ps -ef` la POSIX, y mezclar ambas es el error habitual.topRedibuja la lista de procesos cada pocos segundos; sus opciones cambian por completo segun la plataforma: una sola muestra es `-b -n 1` en Linux y `-l 1` en macOS.htopUna reescritura de top con color y raton donde F9 envia una senal directamente, pero no viene instalado: primero `apt install htop` o `brew install htop`.killEnvia una senal a un PID para cerrar un proceso; el TERM por defecto le deja limpiar, mientras que `-9` no se puede interceptar y deja atras archivos abiertos y bloqueos.killallMata procesos por nombre en lugar de por PID; el nombre debe coincidir exactamente con el ejecutable, asi que `killall chrome` no alcanza a "Google Chrome".pkillMata todos los procesos que coinciden con un patron; sin `-f` solo se compara el nombre, y un patron amplio se lleva mas de lo previsto: prueba antes pgrep con el mismo patron.pgrepSolo imprime los PID que coinciden con un patron, con las mismas reglas que pkill, asi que sirve de ensayo antes de matar nada.jobsUn builtin del shell que numera solo los trabajos en segundo plano de este shell: los de otra terminal no aparecen y se referencian como `%1`, no por PID.bgReanuda en segundo plano un trabajo detenido con Ctrl+Z; sigue perteneciendo a este shell, asi que cerrar la terminal se lo lleva salvo que uses nohup o disown.fgTrae de vuelta a la terminal un trabajo detenido o en segundo plano; solo funciona con trabajos de este shell y se indican con un numero como `%1`, no con el PID.nohupHace que un comando ignore la senal de cierre para sobrevivir al cierre de sesion; no lo manda a segundo plano, asi que el `&` lo pones tu, y la salida se acumula en ./nohup.out.niceArranca un comando con menor prioridad de CPU; el valor va de 19 (mas cede) a -20 (mas acapara), los negativos requieren root y solo afecta a la CPU, no al disco (eso es ionice).reniceCambia la prioridad de un proceso ya en marcha; un usuario normal solo puede hacerlo mas cedente, y recuperar la prioridad exige root.systemctlArranca, detiene e inspecciona servicios de systemd; `enable` solo fija el arranque, asi que usa `enable --now` para iniciarlo tambien, y ejecuta `daemon-reload` tras editar un unit.journalctlLee el registro binario que recopila systemd; sin /var/log/journal el registro se borra al reiniciar, y `-u` exige el nombre exacto del unit.serviceUna envoltura fina heredada de la era SysV; en una maquina con systemd solo reenvia a systemctl y entiende menos verbos.crontabGestiona la tabla de tareas por usuario; cron corre casi sin PATH y no lee tu perfil de inicio, asi que usa rutas absolutas, y `crontab -r` borra la tabla entera sin preguntar.atEjecuta un comando una sola vez a la hora que indiques; el demonio atd debe estar activo (a menudo ni siquiera esta instalado) y la salida llega por correo, no a la pantalla.uptimeMuestra cuanto lleva encendida la maquina y la carga media; esos tres numeros son procesos listos promediados en 1, 5 y 15 minutos, no porcentajes, asi que 4.00 en 4 nucleos es carga plena.freeCuenta cuanta memoria y swap quedan en Linux; la columna que importa es available, no free, porque la cache se devuelve cuando hace falta, y macOS no tiene free (usa vm_stat).vmstatImprime contadores de memoria, swap, disco y CPU a intervalos fijos; descarta la primera linea, que es un promedio desde el arranque y no el momento actual, y mira antes las columnas si/so y wa.iostatMuestra el rendimiento por disco y cuanto esperan las peticiones; el primer bloque es un promedio desde el arranque, Linux necesita el paquete sysstat y macOS usa otras opciones como `-w 1 -c 5`.lsblkPresenta los discos y sus particiones en arbol; no muestra el espacio libre sin particionar (para eso fdisk o parted) y es solo de Linux, asi que en macOS se usa `diskutil list`.unameInforma del nombre del nucleo, su version y la arquitectura; no dice la distribucion, para eso se lee /etc/os-release (o `sw_vers` en macOS), y `-o` solo existe en GNU.hostnameImprime o cambia el nombre de la maquina; `hostname web01` solo dura hasta el reinicio, asi que hazlo permanente con `hostnamectl` en Linux o `scutil --set HostName` en macOS, y `-I` para ver todas las IP existe solo en Linux.dateImprime la hora actual en el formato que quieras y hace aritmetica de fechas; el formato tras `+` es igual en todas partes, pero desplazar una fecha es `-d` en GNU y `-v` o `-j -f` en macOS/BSD.envImprime todo el entorno o ejecuta un comando con variables anadidas; esas variables solo valen para esa ejecucion y no queda nada en tu shell.exportMarca una variable para que la hereden los procesos hijos; muere con este shell, asi que ponla en ~/.bashrc o ~/.zshrc para conservarla, y un `VAR=x` sin export sigue invisible para los programas que lances.whichRecorre PATH y dice donde esta el ejecutable con ese nombre; como solo mira PATH, miente sobre alias, funciones y builtins del shell, y la respuesta honesta la da `type -a` o `command -v`.typePregunta al propio shell que es realmente un nombre: alias, funcion, builtin o archivo, justo lo que `which` no ve porque solo mira PATH.lsofLista cada archivo y socket abierto, y asi responde a "quien tiene el puerto 3000"; sin sudo solo ves tus procesos, por lo que un resultado vacio no significa que el puerto este libre.fuserEncuentra, y si lo pides mata, lo que esta usando un archivo, un punto de montaje o un puerto; `-k` envia SIGKILL sin margen para limpiar y solo existe en Linux (psmisc), porque la version de macOS solo tiene `-cfu`.watchVuelve a ejecutar el mismo comando cada pocos segundos y redibuja la pantalla; entrecomilla todo lo que lleve tuberia o `*`, o el shell lo aplicara una sola vez a watch, y macOS no lo incluye.timeoutEjecuta un comando con limite de tiempo y lo corta al pasarse, saliendo con 124; la senal por defecto es TERM, que un programa colgado puede ignorar, asi que anade `-k` para rematar con KILL (GNU coreutils, no esta en macOS).straceImprime cada llamada al sistema que hace un proceso, y asi ves donde se atasca; la salida va a stderr, redirigela con `2>&1`, necesita permiso ptrace (normalmente sudo) y solo existe en Linux (macOS tiene dtruss).dmesgLee el buffer circular del nucleo, el primer sitio donde mirar tras un problema de disco o USB; es un buffer de tamano fijo, asi que las lineas viejas ya se fueron, y casi todas las distribuciones piden root (macOS usa `log show`).

Red28

Cuando falla una conexión, estos acotan hasta dónde llegó: el nombre no resuelve, no hay ruta o el puerto está cerrado.

curlDescarga una URL e imprime el cuerpo en la terminal; a diferencia de un navegador, no sigue redirecciones sin `-L`, asi que un 301 parece una respuesta vacia.wgetDescarga una URL a un archivo y sigue las redirecciones por si mismo; esa es la diferencia con curl, que imprime en la terminal si no se le indica otra cosa, y macOS no lo incluye.pingEnvia peticiones ICMP echo para ver si un equipo responde y cuanto tarda; que no responda no significa que este caido, porque muchos cortafuegos descartan ICMP mientras TCP funciona.tracerouteEnumera los routers por los que pasa un paquete hasta el destino; una linea `* * *` en medio no significa que el camino este roto, solo que ese router no responde.digPregunta directamente a un servidor DNS y muestra los registros tal cual; se salta /etc/hosts y la cache del sistema, asi que la respuesta puede diferir de lo que ve el navegador, y algunas distribuciones exigen instalar dnsutils o bind-utils.nslookupLa herramienta antigua para resolver nombres: aun funciona, pero su formato de salida y su codigo de salida son tan inconsistentes que no sirve en scripts, y dig ha ocupado su lugar.hostResponde una consulta de nombre en dos o tres lineas con direcciones y servidores de correo; es lo mas comodo para una comprobacion rapida, pero para ver todos los registros hace falta dig.ssLa forma moderna de listar sockets abiertos en Linux, sucesora de netstat y mucho mas rapida en equipos con mucho trafico; ojo: `-p` solo muestra el proceso dueno si eres root.netstatLa forma antigua de ver sockets y la tabla de rutas; en Linux ha cedido su puesto a ss y muchas veces no esta instalada, y aunque macOS la conserva, no dice que proceso posee un socket: eso lo responde lsof.ipEl unico comando de Linux para direcciones, rutas y tabla de vecinos, que sustituye a ifconfig, route y arp; lo que cambies con el desaparece al reiniciar salvo que lo escribas tambien en la configuracion de red.ifconfigEl comando antiguo para ver y tocar interfaces de red; en Linux `ip addr` lo ha sustituido, puede que ni este instalado y no muestra todas las direcciones anadidas con ip, pero en macOS sigue siendo la herramienta real.routeLee y edita la tabla de rutas del nucleo, pero en Linux ha cedido el paso a `ip route`, y en BSD/macOS la sintaxis es distinta, como `route -n get default`, asi que los ejemplos no se trasladan.arpMuestra la tabla de direcciones MAC de los vecinos de la misma red local; nada mas alla del router aparece ahi, y en Linux la herramienta actual es `ip neigh`.nc (netcat)Abre una conexion TCP o UDP en crudo para ver si un puerto responde y canaliza bytes entre dos maquinas; tres netcat incompatibles comparten el nombre (OpenBSD, GNU, ncat de Nmap), asi que `-z` o `-p` puede que no existan en el tuyo.telnetAbre una sesion TCP en claro donde todo viaja sin cifrar, asi que nunca debe usarse para iniciar sesion (para eso ssh); su uso restante es comprobar si un puerto responde, y se sale con Ctrl+] y luego quit.sshAbre una shell cifrada en otra maquina; ssh rechaza de plano una clave privada que otros puedan leer, asi que aplicale `chmod 600`, y el puerto es `-p` aqui pero `-P` en scp y sftp.ssh-keygenCrea un par de clave publica y privada; a un servidor solo sube la mitad `.pub`, y una clave hecha sin frase de paso es un archivo suelto con el que puede entrar cualquiera que lo copie.ssh-copy-idAgrega tu clave publica al ~/.ssh/authorized_keys del servidor para que deje de pedir contrasena; el acceso por contrasena debe seguir abierto en esa primera vez, y `-i` recibe el archivo `.pub`, no la clave privada.sftpUna herramienta interactiva de transferencia sobre la conexion ssh; la opcion de puerto es `-P` en mayuscula, no la `-p` de ssh, y no ejecuta comandos remotos: solo sus propios put, get y ls.scpCopia archivos por ssh de una vez; el puerto es `-P` en mayuscula, la ruta remota necesita dos puntos, y para transferencias grandes o repetidas rsync es mejor porque omite lo que no cambio y reanuda.iptablesEdita el filtro de paquetes en vivo; las reglas se evaluan de arriba abajo y gana la primera coincidencia, asi que un DROP anadido tras un ACCEPT nunca actua, las reglas se pierden al reiniciar si no las guardas, y poner la politica por defecto en DROP antes de permitir el puerto 22 te deja fuera de una maquina remota.ufwUna envoltura amable de iptables en Debian y Ubuntu; permite SSH antes de hacer `enable` o cortaras la sesion en la que estas, y Docker publica puertos directamente en iptables, donde las reglas de ufw no llegan.tcpdumpCaptura los paquetes que pasan por el cable; requiere root, lo que se captura se escribe tras las opciones en su propia sintaxis de filtro como `port 443 and host x`, y capturar sin filtro en una interfaz cargada sepulta la terminal al instante.whoisConsulta el registro de un dominio o bloque de IP; los datos personales suelen estar ocultos y cada servidor de TLD responde con su propio formato, asi que analizar esa salida en un script se rompe con facilidad.nmapBarre un equipo para ver que puertos responden; `-sS` y `-O` requieren root, y escanear una maquina ajena queda registrado como ataque en sus logs y es ilegal en algunos paises, asi que limitalo a tus propias redes.openssl s_clientAbre una conexion TLS en crudo para inspeccionar el certificado y el saludo; sin `-servername`, un servidor con muchos sitios en una direccion te entrega su certificado por defecto, y sin `< /dev/null` se queda esperando entrada.speedtestMide la velocidad de la linea enviando trafico real a un servidor cercano; no viene instalado en ningun sistema y dos programas distintos comparten el nombre (el speedtest de Ookla y el speedtest-cli de Python) con opciones diferentes.mtrCombina traceroute y ping en una tabla que se actualiza sin parar, la herramienta adecuada para perdidas intermitentes; la perdida en un salto intermedio suele ser ese router limitando sus respuestas, y solo la que llega hasta el ultimo salto es real.

Comprimidos14

Empaquetar y comprimir son tareas distintas: tar empaqueta, gzip reduce y .tar.gz es lo uno y lo otro.

tarEmpaqueta archivos en uno solo pero no comprime por sí mismo: de eso se encargan `-z` (gzip), `-j` (bzip2) y `-J` (xz); elige exactamente uno entre `-c` para crear, `-x` para extraer o `-t` para listar, y deja `-f` como última opción, porque el nombre del paquete va justo detrás.gzipComprime un solo archivo en .gz y, por defecto, borra el original al terminar, así que consérvalo con `-k` o escribiendo a la salida estándar con `-c`; nunca agrupa varios archivos, y por eso tar va delante.gunzipDescomprime un .gz y devuelve el archivo original, eliminando el .gz si todo va bien: `-k` lo conserva, `-f` hace falta cuando ya existe un archivo con ese nombre, y `-c` envía el contenido a la salida estándar sin escribir nada en disco, igual que zcat.zipA diferencia de tar, incluye su propia compresión y es el formato que Windows abre sin instalar nada; para una carpeta hace falta `-r`, o solo guardarás la entrada del directorio y nada de su contenido, y la contraseña de `-e` es ZipCrypto antiguo y débil.unzipExtrae un .zip y, sin `-d`, lo vuelca directamente en el directorio actual, así que usa `-l` antes para ver si trae una carpeta raíz; los nombres de zips hechos en Windows antiguos requieren `-O CP932`, y la contraseña de `-P` queda a la vista en el historial del shell y en ps.bzip2Comprime más que gzip a cambio de tardar más y, como gzip, borra el original y deja solo el .bz2 salvo que pases `-k`; su opción en tar es `-j`, y descomprimir es `-d`, que es lo que hace bunzip2.xzDa la salida más pequeña de los tres formatos habituales, aunque es lento y a `-9` pide unos 700 MB de memoria; usa un solo núcleo si no añades `-T0`, borra el original sin `-k`, y su opción en tar es la `-J` mayúscula.zcatEnvía el contenido de un .gz a la salida estándar sin descomprimirlo en disco, que es la forma de hacer grep sobre un log rotado tal cual; `-f` deja pasar también los archivos sin comprimir en la misma pasada, y bzip2, xz y zstd tienen sus propios bzcat, xzcat y zstdcat.7zSe usa con un verbo delante — `a` para añadir, `x` para extraer con rutas, `e` para aplanarlas, `l` para listar —, lee mucho más que .7z, también zip, tar y rar, y comprime más que la mayoría; el directorio de salida va pegado a `-o`, sin espacio, y `-mhe=on` junto a `-p` es lo que además oculta los nombres.ddCopia bloque a bloque, y así se escriben las imágenes de instalación en un dispositivo; lo que pongas en `of=` se sobrescribe desde el bloque cero, sin confirmación y sin vuelta atrás, así que verifica el dispositivo con lsblk justo antes de pulsar Enter, usa `bs=4M` por velocidad y `status=progress` (Ctrl+T en macOS) para seguirlo.splitCorta un archivo grande en trozos; por defecto lo hace por líneas, 1000 cada vez, así que usa `-b 100M` cuando querías tamaño, los trozos se llaman xaa, xab y así salvo que des un prefijo, y se recomponen con un solo `cat part_* > file`, que funciona porque los sufijos se ordenan.cpioUn archivador antiguo que toma de la entrada estándar la lista de nombres a empaquetar, y por eso suele alimentarlo find; `-o` crea el archivo, `-i` lo extrae, `-t` lo lista, `-H newc` es el formato portable que usan las imágenes initramfs, y `--no-absolute-filenames` evita que un archivo ajeno escriba en rutas absolutas.zstdEl moderno: alcanza el tamaño de gzip varias veces más rápido y, en `-19`, se acerca al de xz en una fracción de su tiempo; a diferencia de gzip conserva el original por defecto (`--rm` lo borra), `-T0` usa todos los núcleos y en tar se invoca con `--zstd`.rarUn formato propietario del que solo el extractor es gratis: crear un archivo requiere el binario rar de pago, mientras que `unrar x` —o `7z x`, sin instalar nada de RARLAB— abre el que te han enviado; `x` mantiene las rutas guardadas y `e` las aplana, `-hp` oculta también los nombres y `-v100m` lo parte en volúmenes.

Permisos15

El modo numérico y el simbólico nombran lo mismo: 755 y u=rwx,go=rx son el mismo permiso.

chmodFija los bits de permiso de archivos y directorios; chmod -R 755 también vuelve ejecutables los archivos normales, así que usa la X mayúscula para no tocarlos.chownCambia el propietario y el grupo de un archivo; solo root puede regalar un archivo a otro, y por eso casi siempre requiere sudo.chgrpCambia solo el grupo de un archivo, algo que chown también hace con :group; si no eres root solo puedes asignar un grupo al que perteneces.umaskDecide qué bits de permiso se retiran a los archivos nuevos; resta en vez de conceder, así 022 da 644 en archivos y 755 en directorios, y no afecta a lo que ya existe.sudoEjecuta una orden como otro usuario, root por defecto; la redirección de sudo cmd > file la abre tu propio shell, así que falla con un archivo de root y ahí entra tee.suTe convierte en otro usuario con la contraseña de ese usuario, al contrario de sudo que pide la tuya; sin el guion conservas tu PATH, la causa habitual de command not found.idImprime los identificadores de usuario y grupo con los que corre un proceso; id -u igual a 0 significa root, la forma estándar de que un script compruebe privilegios.groupsEnumera los grupos a los que pertenece un usuario; un grupo recién añadido con usermod no aparece hasta volver a iniciar sesión, porque la lista se fija al abrir la sesión.whoamiImprime el nombre de usuario efectivo, no el de inicio de sesión, así que dentro de sudo o su dice root.passwdCambia la contraseña de acceso y guarda su hash en /etc/shadow; macOS carece de casi todas las opciones de Linux y usa dscl o los Ajustes.getfaclMuestra la lista de control de acceso, los permisos extra por usuario más allá de propietario, grupo y otros; es de Linux con el paquete acl, mientras macOS enseña su propia ACL con ls -le.setfaclConcede permisos a un usuario o grupo extra sin cambiar el propietario; cuando existe una ACL, ls muestra un + tras los permisos, y la entrada mask puede recortar en silencio lo concedido.chattrAplica atributos a nivel de sistema de archivos, como el inmutable; con +i incluso root debe quitar la marca antes de editar, y solo funciona en Linux sobre ext4, xfs o btrfs.xattrLee y borra atributos extendidos en macOS, sobre todo com.apple.quarantine, la marca detrás del aviso de aplicación dañada; en Linux se usan getfattr y setfattr.visudoEdita /etc/sudoers con bloqueo y comprobación de sintaxis antes de guardar; tocar ese archivo a mano y equivocarse deja a todos sin sudo, y eso es lo que visudo evita.

Paquetes y entornos25

La pregunta siempre es qué va dónde: dentro de este proyecto o en todo el sistema.

npm installDescarga en node_modules las dependencias que pide package.json y actualiza package-lock.json; desde npm 7 también instala las peer, y --production fue reemplazado por --omit=dev.npm ciBorra node_modules e instala exactamente lo que dice package-lock.json; nunca modifica el lockfile y falla si no concuerda con package.json, por eso CI lo usa en lugar de install.npm runEjecuta un comando de la sección scripts de package.json; los argumentos para el script requieren un -- delante, y solo start y test pueden llamarse sin run.npm initCrea un package.json; npm init <nombre> es otra cosa: descarga y ejecuta create-<nombre>, como hace npx.npxEjecuta el binario de un paquete, prefiriendo node_modules/.bin y descargándolo temporalmente si no está; como una errata puede traer un paquete ajeno, --no lo limita a lo local.yarn addAñade un paquete y actualiza yarn.lock; yarn a secas equivale a install, y Yarn 2 eliminó yarn global add, así que las herramientas de un solo uso van por yarn dlx.pnpm addGuarda el paquete en un almacén compartido y lo enlaza en node_modules; en la raíz de un workspace pnpm rechaza un add simple y pide -w o --filter.npm auditInforma de vulnerabilidades conocidas en lo instalado; fix --force sube a versiones mayores que rompen, y los avisos en dependencias solo de desarrollo a menudo no tienen arreglo.npm publishSube el paquete al registro; un nombre con scope es privado por defecto, de ahí --access public, y un número de versión no se puede reutilizar, así que revisa la lista de archivos con --dry-run.node --versionImprime la versión del node que aparece primero en el PATH; por eso la terminal del editor o un job de CI pueden dar otra cuando hay un gestor de versiones.nvm useCambia qué Node usa el shell actual; el cambio vive solo en ese shell, así que una terminal nueva o un job de CI vuelven al valor por defecto, y como nvm es una función de shell, un script o Makefile debe cargar nvm.sh antes.brew installInstala una bottle precompilada en macOS y Linux; las aplicaciones con interfaz necesitan --cask, y actualizar es tarea de brew update y brew upgrade, no de install.apt-get installInstala desde la lista de paquetes que ya está en disco, así que una lista vieja da "Unable to locate package" hasta que corras apt-get update; apt-get mantiene una interfaz estable para scripts, mientras apt está pensado para personas.apt updateSolo refresca las listas de paquetes, por lo que hace falta apt upgrade para instalar algo; un contenedor recién creado tiene la lista vacía, así que este es el primer comando.dnf installInstala desde los repositorios habilitados resolviendo dependencias y refresca los metadatos por sí solo, sin el paso de update que exige apt; en RHEL 8 y posteriores yum es un enlace a dnf, y Fedora 41 pasó a dnf5.pacman -SInstala un paquete desde los repositorios sync de Arch; al ser rolling, refrescar con -Sy e instalar sin actualizar produce una actualización parcial que rompe bibliotecas, así que usa -Syu.pip installInstala un paquete en el Python activo; invocarlo como python -m pip evita el caso clásico de un pip que pertenece a otro intérprete, y desde PEP 668 un Python del sistema rechaza instalar fuera de un entorno virtual.pip freezeImprime cada paquete instalado con su versión exacta, listo para redirigir a requirements.txt; incluye las dependencias transitivas además de las que elegiste, así que hay que ejecutarlo dentro del entorno virtual.python -m venvCrea un intérprete aislado y su site-packages en una carpeta; crearlo no hace nada hasta que lo actives o llames a .venv/bin/python, y las rutas quedan grabadas, así que renombrar la carpeta después lo rompe.docker runCrea y arranca un contenedor nuevo desde una imagen cada vez, así que ejecutarlo dos veces deja dos contenedores y reiniciar uno existente es docker start; sin -p nada es accesible desde el host, y sin -v lo escrito muere con el contenedor.docker psLista solo los contenedores que están corriendo; uno que murió justo al arrancar no aparece hasta usar -a, y ahí hay que mirar cuando docker run parece no haber hecho nada.docker buildConstruye una imagen desde un Dockerfile; el punto final es el contexto que se envía al demonio, así que una carpeta enorme ralentiza la construcción hasta que .dockerignore la recorta, y COPY solo ve archivos dentro de ese contexto.docker compose upArranca todos los servicios de compose.yaml como un proyecto; el docker-compose con guion es la v1 retirada y docker compose es el plugin v2, y los contenedores existentes se reutilizan salvo con --build o --force-recreate.docker execEjecuta otro proceso dentro de un contenedor que ya está corriendo; falla si está detenido, y las imágenes slim no traen bash, así que entras con sh.docker logsMuestra lo que el proceso principal del contenedor escribió en stdout y stderr; una app que escribe su log en un archivo interno no muestra nada aquí, y los logs desaparecen con el contenedor.

Cómo leerlo

  • Los corchetes [ ] marcan una parte que puedes omitir.
  • Los puntos suspensivos … indican que puedes poner varios.
  • Las opciones distinguen mayúsculas: en algunos comandos -r y -R no hacen lo mismo.

Preguntas

Q. ¿Por qué no se traducen los nombres de los comandos?

Porque se escriben tal cual. Un ls traducido es un nombre que la shell no conoce. Las opciones quedan igual por lo mismo: solo cambian de idioma las explicaciones.

Q. Las opciones no son iguales en macOS y en Linux.

No lo son. macOS trae herramientas BSD, así que faltan opciones de GNU: sed -i pide un argumento y ps no acepta -ef. Donde se separan, la explicación dice de qué sistema es.

Q. ¿Cómo reconozco los comandos que no se pueden deshacer?

Su explicación lo dice. rm no pasa por la papelera, dd sobrescribe un disco si of= está mal, y git reset --hard y git clean -fd tiran el trabajo sin confirmar.