La línea de comandos es una interfaz basada en texto que se usa para operar software e interactuar con el sistema operativo escribiendo comandos en la interfaz y recibiendo una respuesta de la misma manera. Hay varias razones por las que usamos la línea de comandos en lugar de usar una interfaz gráfica.
Muchas herramientas bioinformáticas solo se pueden usar a través de una interfaz de línea de comandos o tienen capacidades adicionales en la versión de línea de comandos que no están disponibles en la interfaz gráfica. Un ejemplo es BLAST, que en su versión de línea de comando ofrece muchas funciones avanzadas no disponibles en la web.
Los comandos están diseñados para trabajar en secuencia. Cada uno de los comandos de Linux está diseñado para hacer algo particular y hacerlo bien. La filosofía detrás de este diseño es agregar más funcionalidad al agregar otro comando que se pueda encadenar a la salida del anterior generando lo que llamamos una tubería o pipeline. Esto lo vamos a ver en detalle más adelante.
Las personas tenemos tendencia a cometer errores. Las secuencias de comandos permiten estandarizar un conjunto de instrucciones que se van a ejecutar de la misma manera cada vez que se ejecute la secuencia de comandos.
La línea de comando también permite que tareas repetitivas sean ejecutadas en una única acción.
El scripting de shell nos permite automatizar tareas o comandos, que alternativamente tendrían que ejecutarse una por una por un operador humano.
Muchos problemas bioinformáticos requieren mucho poder computacional y no pueden ejecutarse de manera realista en nuestras máquinas personales. En estos casos vamos a trabajar en servidores remotos, y la línea de comando permite trabajar de forma remota con mayor facilidad que la interfaz gráfica; la interfaz gráfica remota es muy lenta.
Para explicar un poco la jerga, la terminal es la ventana que se abre en el entorno de escritorio. Al abrir una terminal se ejecuta un segundo programa, el shell, que es el interpretador de comandos. El shell interpreta lo que escribimos en la terminal y lo convierte en instrucciones para el sistema. En la mayor parte de los sistemas tipo Unix/Linux, el shell por defecto para las cuentas de usuario es Bash (Bourne-again shell).
La interfaz de línea de comando es una forma de pasar instrucciones a la computadora en forma de líneas de texto, que serán interpretadas por el shell.
El prompt es el carácter o conjunto de caracteres el shell nos muestra para indicar que está a la espera de instrucciones. En los sistemas tipo Unix/Linux el prompt incluye el símbolo $
para los usuarios y #
para el administrador (root
), además de información acerca del usuario, equipo y directorio de trabajo en el cual estamos “parados”. Por ejemplo:
estudiantes@equipo:~$
root@equipo:/media#
En el primer ejemplo, “estudiantes” es el nombre de usuario, seguido de @ y el nombre de la máquina (“equipo”), el símbolo tilde (~) que representa el home del usuario, el directorio actual en este ejemplo, y el carácter $
que indica que es una cuenta de usuario. En segundo ejemplo, el usuario es el root, lo que también se indica con el carácter #
, y el directorio de trabajo es /media
.
En un sistema Ubuntu 18.04, que es el que está ejecutándose en su máquina virtual, puede encontrar un lanzador para el terminal haciendo clic en el elemento “Actividades” en la parte superior izquierda de la pantalla o en el elemento “Mostrar aplicaciones” en la parte inferior izquierda, luego escribiendo las primeras letras de “terminal”, “comando”, “prompt” o “shell”.
Shortcut: puede abrir una ventana de terminal usando la combinación de teclas Ctrl+Alt+T.
Independientemente de la forma en que abra la terminal, se van a encontrar con una ventana de este tipo:
Los comandos se ejecutan invocándolos por su nombre desde el prompt. Además, éstos suelen tener opciones y argumentos. Los argumentos son las entradas que le pasamos al programa al momento de ejecutarlo para que sean procesadas. Las opciones modifican la forma en que funciona el programa, y suelen estar representados por una letra precedida de un guión. Si un programa tiene tanto opciones como argumentos, primero se pasan las opciones y después los argumentos.
Veamos un ejemplo con el comando ls
, (de list), que nos lista en pantalla los nombre de los archivos de un directorio dado. Este comando, por defecto lista los nombre de los archivos contenidos en el directorio de trabajo actual. De esta manera, si escribimos en la terminal ls
, vamos a obtener una lista de los archivos y directorios que se encuentran en donde estamos parados.
estudiantes@equipo:~$ ls
busco_downloads Descargas Documentos Escritorio igv Imágenes Programas R
Es posible que querramos listar el contenido de otro directorio o archivo, por ejemplo, podemos listar el contenido del directorio /home
. En los sistemas linux, este directorio contiene el home personal de cada usuario, por lo que vamos a obtener una lista con el home de cada usuario.
estudiantes@equipo:~$ ls /home
estudiantes
falvarez
lucia
luisa
Pero también es posible que querramos obtener más detalles del contenido del directorio, por ejemplo, información de permisos, tamaño, o fecha de modificación. Para eso, usamos la opción “-l” (de long list).
estudiantes@equipo:~$ ls -l /home
total 16
drwxr-xr-x 20 estudiantes estudiantes 4096 abr 7 01:57 estudiantes
drwxr-xr-x 23 falvarez falvarez 4096 mar 20 13:42 falvarez
drwxr-xr-x 20 lucia lucia 4096 mar 23 18:42 lucia
drwxr-xr-x 2 luisa luisa 4096 feb 12 2020 luisa
En este ejemplo, ls
es el comando, -l
es una opción, ya que cambia la forma en que funciona el comando, y /home
es un argumento.
Distintos comandos tienen distinto número de argumentos, que pueden ser obligatorios u opcionales. Vamos a ir viendo ejemplos de ello a medida que avancemos en el práctico. También vamos a ver más sobre la información que nos da ls -l
, en particular la parte de permisos de acceso.
En Unix los archivos están organizados en directorios (equivalentes a las carpetas de Windows). Esto, que llamamos el sistema de archivos, tiene una estructura jerárquica o de árbol con la raíz en la parte superior. La raíz o root está simbolizada por el carácter /
.
El directorio en el que nos encontramos al abrir una terminal es el home de nuestro usuario, que se encuentra dentro del directorio /home
. Como se mencionó anteriormente, este directorio está simbolizado por el carácter ~
, como puede ver en su prompt.
Para conocer el directorio de trabajo actual (es decir, en dónde nos encontramos en el sistema de archivos), usamos el comando pwd
(por print working directory). Para cambiar de directorio usamos el comando cd
(change directory), dándole como argumento el directorio hacia el que nos queremos mover. Además, puede acceder al home de su usuario en cualquier momento en forma instantánea usando el comando cd
sin ningún argumento. El programa asumirá como argumento por defecto su directorio personal. Por ejemplo:
Para conocer el directorio de trabajo actual (es decir, en dónde nos encontramos en el sistema de archivos), usamos el comando pwd
(por print working directory). Para cambiar de directorio usamos el comando cd
(change directory), dándole como argumento el directorio hacia el que nos queremos mover. Además,puede acceder al home de su usuario en cualquier momento en forma instantánea usando el comando cd
sin ningún argumento. El programa asumirá como argumento por defecto su directorio personal. Por ejemplo:
# imprimimos el directorio de trabajo actual
estudiantes@equipo:~$ pwd
/home/estudiantes
# nos movemos con el comando cd
estudiantes@equipo:~$ cd /media
# verificamos que nos movimos imprimiendo el directorio de trabajo
estudiantes@equipo:/media$ pwd
/media
# volvemos a nuestro home
estudiantes@equipo:/media$ cd
estudiantes@equipo:~$
Puede ver que a medida que nos movimos, el prompt fue cambiando para indicar el nuevo directorio de trabajo.
Entender cómo funcionan los permisos es fundamental para trabajar cómodamente en sistemas multi-usuario, además de proveer de un nivel fundamental de seguridad a nuestros archivos y directorios.
En primer lugar, los archivos tienen tres tipos de permisos: lectura (r), escritura (w), y ejecución (x). El permiso de lectura se refiere a poder acceder al contenido del archivo y copiar el archivo, el de escritura refiere a poder modificar su contenido, y el de ejecución a poder ejecutarlo (solo tiene sentido para archivos ejecutables). Generalmente sólo el propietario del archivo tiene permiso de escritura, a menos que se modifiquen sus permisos.
Por otro lado, tenemos tres tipos de usuario: usuario (u), grupo (g), y otros (o). Cada archivo es propiedad de un usuario específico y un grupo específico. Los permisos de usuario son los utilizados por el usuario al que pertenece un archivo o directorio, y los permisos de grupo son utilizados por el grupo al que pertenece el archivo o directorio. Los permisos de otros son usados por los usuarios que no son el propietario ni los miembros del grupo que posee el archivo o directorio. De estos tres grupos, los que realmente nos van a importar son los de usuario y los de otros, no nos vamos a preocupar por los grupos.
Cada archivo o directorio tiene tres sets de permisos, uno por cada tipo de usuario, es decir que hay un set (r,w,x) para el usuario, otro para el grupo, y otro para otros, mostrados en ese orden a la izquierda de los detalles del archivo o directorio que se listan con el comando ls -l
.
En esta representación, el primer espacio corresponde al tipo de archivo: un guión (-) simboliza un archivo y una (d) simboliza un directorio. Los siguientes tres espacios son los permisos del dueño del archivo, en orden (r,w,x). Un guión representa que no tenemos dicho permiso. En el ejemplo de la imagen, el dueño del archivo tiene permisos de lectura y escritura pero no de ejecución. Tanto los usuarios del grupo como otros usuarios sólo tienen permiso de lectura. Luego de los permisos tenemos la información del usuario al que pertenece el archivo y luego la del grupo.
Como vimos anteriormente, usando la opción ls -l
(long list) obtenemos los detalles de permisos de acceso, dueño, grupo, tamaño, y fecha de modificación de los archivos. Para listar los permisos de un directorio y no de su contenido, usamos la combinación de las opciones -l
y -d
, (o -ld
, que es lo mismo).
#listamos los detalles del archivo .bashrc
estudiantes@equipo:~$ ls -l .bashrc
-rw-r--r-- 1 estudiantes estudiantes 3926 mar 20 15:01 .bashrc
#listamos los detalles del contenido del directorio /home
estudiantes@equipo:~$ ls -l /home
total 16
drwxr-xr-x 20 estudiantes estudiantes 4096 abr 7 01:57 estudiantes
drwxr-xr-x 23 falvarez falvarez 4096 mar 20 13:42 falvarez
drwxr-xr-x 20 lucia lucia 4096 mar 23 18:42 lucia
drwxr-xr-x 2 luisa luisa 4096 feb 12 2020 luisa
#listamos los detalles del directorio /home
estudiantes@equipo:~$ ls -l -d /home
drwxr-xr-x 6 root root 4096 mar 17 18:00 /home/
El comando chmod
(change mode) permite cambiar los permisos, mientras que el comando chown
(change owner) cambia el usuario al que pertenece el archivo. Tenga en cuenta que sólo puede cambiar los permisos y propiedad de sus propios archivos, a menos que tenga permisos de administrador.
estudiantes@equipo:~$ echo "echo Hola" > file #escribimos una instrucción ejecutable en un archivo
estudiantes@equipo:~$ chmod u+x file # damos permisos de ejecución al usuario
estudiantes@equipo:~$ ./file # ejecutamos el archivo
Hola
En este caso dimos permisos de ejecución al usuario “estudiantes”, que es a quien pertenece el archivo. De forma general, primero decimos a quién le queremos dar permisos y luego qué permiso queremos dar. Por ejemplo, o+w
da permisos de escritura a “otros”, y a+x
da permiso de ejecución a todos los grupos.
En todos los sistemas Unix, incluido Linux, un superusuario es el usuario del sistema que tiene todos los permisos para poder realizar tareas administrativas.
La forma de Ubuntu de realizar tareas administrativas es ganar temporalmente privilegios de superusuario colocando el comando sudo
(por super user do) delante de otro comando que requiere poderes de superusuario. Por ejemplo, vamos a listar el contenido de un directorio al que no tenemos acceso sin dichos permisos con y sin sudo:
estudiantes@equipo:~$ ls /root
ls: no se puede abrir el directorio '/root/': Permiso denegado
estudiantes@equipo:~$ sudo ls /root/
[sudo] contraseña para estudiantes:
Descargas Documentos Escritorio igv Imágenes Música Plantillas Público snap Vídeos
Al usar sudo, el sistema responderá pidiendo su clave (que es idéntica a su contraseña de inicio de sesión). Mientras escribe la clave, no aparecerá nada en la terminal (no verá asteriscos como en otras interfaces), simplemente escriba su clave y presione Enter.
Nos podemos referir a la posición de los archivos en el sistema de archivos de dos formas, la absoluta y la relativa. En la primera indicamos la ubicación absoluta del archivo desde la raíz del sistema de archivos, que es independiente del lugar en el que estamos nosotros. Notar que, como salen de la raíz, las rutas absolutas siempre comienzan con el símbolo /
y siempre que una ruta comienza con este símbolo es absoluta.
La ruta relativa refiere a la ubicación del archivo en relación al lugar donde nos encontramos nosotros en el sistema de archivos, es decir el directorio de trabajo actual. Esta ruta dependerá de dónde nos encontramos parados. Para determinarlo, coma fuera mencionado, usamos el comando pwd
. Esto nos devolverá el path absoluto del directorio en el que nos encontramos. Para usar las rutas relativas deberemos aprender a movernos hacia arriba en la jerarquía. Para eso usaremos el punto .
y el doble punto ..
.
..
El doble punto significa el directorio padre del directorio actual (el directorio justo encima de donde estamos). Por ejemplo, si estamos en /home/estudiantes
, ..
refiere a /home
, ../..
refiere al directorio raíz (/
), y ../../media
refiere a /media
.
.
El punto refiere al directorio actual (donde estamos parados). Por ejemplo, file.txt
y ./file.txt
refieren al mismo archivo. Esto lo usaremos principalmente para copiar archivos a donde estamos parados. Por ejemplo, cp ../file .
copia “file” del directorio padre al actual. Con excepción de los archivos ejecutables, cuando nos encontramos en el mismo directorio que el archivo que queremos nombrar, podemos referirnos a él solamente por su nombre corto, sin necesidad de indicar la ruta (por ejemplo, ls file
). En cambio si queremos ejecutar un archivo que se encuentra en el directorio donde estamos parados, necesitamos usar el punto (por ejemplo, ./file
ejecuta el archivo “file”, si tiene permisos de ejecución).
estudiantes@equipo:~$ pwd
/home/estudiantes
estudiantes@equipo:~$ cd ..
estudiantes@equipo:/home$ pwd
/home
estudiantes@equipo:/home$ cd ../usr/bin/
estudiantes@equipo:/usr/bin$ pwd
/usr/bin
estudiantes@equipo:~$ cd
estudiantes@equipo:~$ pwd
/home/estudiantes
A la hora de nombrar archivos y directorios, hay que tener cuenta:
file.txt
es distinto a File.txt
y a FILE.TXT
.-a
del comando ls
.pwd
y obtiene la siguiente respuesta /usr/local
. Usted quiere ir al directorio bin
que se encuentra en la raíz. ¿Cuál es el path relativo para llegar? ¿Y el absoluto?mkdir
y rmdir
Puede crear un directorio nuevo con el comando mkdir
seguido del nombre del directorio a crear. De la misma manera, podemos eliminar directorios con el comando rmdir
, si el mismo está vacío.
estudiantes@equipo:~$ mkdir nuevo_dir
El comando cp
nos permite copiar archivos o directorios. El comando requiere dos argumentos: el primero es la ruta completa del archivo de origen, el segundo es el directorio de destino.
El siguiente comando copia el archivo “refseq_db.faa” desde el directorio “busco_downloads/lineages/saccharomycetes_odb10/” al directorio “Documentos”.
estudiantes@equipo:~$ cp busco_downloads/lineages/saccharomycetes_odb10/refseq_db.faa Documentos/
Para copiar directorios con todo su contenido, debemos usar la opción -r
. El siguiente comando copia el directorio “busco_downloads/lineages/saccharomycetes_odb10/” y todo su contenido al directorio “Documentos”.
estudiantes@equipo:~$ cp -r busco_downloads/lineages/saccharomycetes_odb10/ Documentos/
Use el comando ls
para verificar si el contenido de “Documentos” es el esperado después de los comandos anteriores.
El comando mv
nos permite mover archivos o directorios. El siguiente comando copia “refseq_db.faa” desde “Documentos” al directorio de trabajo actual (nuestro home).
estudiantes@equipo:~$ mv Documentos/refseq_db.faa .
mv
es un comando flexible que también nos permite renombrar sin cambiar la ubicación, o renombrar y mover a la vez. Esto mueve el directorio “saccharomycetes_odb10” desde “Documentos” hacia donde estamos parados (nuestro home) y además cambia el nombre a “mydir”.
estudiantes@equipo:~$ mv Documentos/saccharomycetes_odb10 mydir
El comando rm
se utiliza para eliminar archivos. Podemos utilizarlo también para eliminar directorios no vacíos, con las opciones -rf
:
estudiantes@equipo:~$ rm -rf mydir
Esto remueve el directorio “mydir” y todos los archivos y directorios que se encuentran dentro.
Cuidado: Los comandos
cp
ymv
sobrescriben sin preguntar. De la misma manera,rm
yrmdir
eliminan definitivamente sin preguntar.
cat
El comando cat
carga todo el contenido del archivo a la memoria y lo manda a la salida estándar (por defecto la pantalla). También es usado para concatenar archivos, para eso le pasamos cada archivo a concatenar como argumento (por ejemplo, cat file1 file2 file3
). Este comando es uno de los más frecuentemente utilizados, pero no es la herramienta ideal para visualizar archivos de gran tamaño.
less
y more
Los comandos less
y more
permiten explorar el contenido del archivo de a una página por vez. La mayor diferencia entre ellos es que less no carga todo el contenido a la memoria a la vez, sino que lo carga a medida que lo vamos explorando. Para salir del modo de exploración de less y more, usamos la tecla Q.
head
y tail
head
y tail
permiten extraer las primeras y últimas líneas de un archivo, respectivamente. Su uso más habitual es extraer las primeras líneas con head
como una forma de exploración rápida. Por defecto nos devuelve las primeras 10 líneas, pero se puede pedir otro número. Por ejemplo, head -20 file
nos da las primeras 20 líneas de “file”.
Los comandos anteriores nos permiten explorar pero no editar archivos. Para hacerlo, debemos usar un editor de texto como nano
o joe
. Simplemente teclee el nombre del editor a usar seguido del nombre del archivo a editar. Las combinaciones de teclas para las funciones más básicas aparecerán en la parte inferior de la pantalla del editor, pero hay muchísimas más funciones y atajos que mejoran la usabilidad de los editores. Puede ver la lista completa de atajos navegando en la ayuda del editor (Ctrl+G en nano
, Q para salir de la ayuda).
¿Cuál es el contenido del archivo /bin/egrep
? ¿Y cuáles son sus permisos? ¿Qué tipo de archivo es?
¿Puede ver el contenido de /bin/grep
? ¿Cuál es la diferencia entre este archivo y archivos como /bin/egrep
?
Abra el archivo .bashrc
que se encuentra en su home
con el editor de texto nano
. Vamos a cambiar el número de comandos que el historial de bash recuerda. Para eso, reemplace HISTSIZE=1000
por HISTSIZE=10000
y HISTFILESIZE=2000
por HISTFILESIZE=20000
. ¿Qué función le parece que cumple el carácter #
que se encuentra al comienzo de muchas de las líneas? Guarde los cambios con la combinación Ctrl+O y salga del editor con la combinación Ctrl+X. Estas combinaciones son muy comunes y es conveniente tenerlas presentes.
Los dispositivos de comunicación entre el usuario y la máquina por defecto son los denominados ‘entrada estándar’ y ‘salida estándar’. Si un programa lee desde la entrada estándar, por defecto estará obteniendo datos desde el teclado. Cuando escribe algún resultado a la salida estándar, lo estará haciendo por defecto a la pantalla. Sin embargo, muchas veces queremos guardar el resultado de un comando en un archivo en lugar de verlo directamente en la pantalla.
Para enviar la salida de un comando a un archivo, redirigimos la salida estándar mediante el operador >
. Luego del comando, añadimos el operador y el nombre del archivo. Esto va a sobrescribir cualquier archivo existente con el mismo nombre. Si el archivo no existe, va a crear uno. Si en lugar de sobrescribir, quisiéramos agregar información al final de un archivo existente, usamos el operador >>
. Esto adjuntará la salida del comando al final del archivo sin borrar el contenido existente.
Veamos un ejemplo con la herramienta blastn
.
Primero invoquemos la ayuda del programa. El programa va a responder mandando a la pantalla la ayuda, que es bastante larga.
estudiantes@equipo:~$ blastn -help
Luego direccionamos la salida a un archivo que creamos al que llamaremos “help.out”.
estudiantes@equipo:~$ blastn -help > help.out
# inspeccionamos las primeras líneas de nuestro archivo con head
estudiantes@equipo:~$ head help.out
USAGE
blastn [-h] [-help] [-import_search_strategy filename]
[-export_search_strategy filename] [-task task_name] [-db database_name]
[-dbsize num_letters] [-gilist filename] [-seqidlist filename]
[-negative_gilist filename] [-negative_seqidlist filename]
[-taxids taxids] [-negative_taxids taxids] [-taxidlist filename]
[-negative_taxidlist filename] [-entrez_query entrez_query]
[-db_soft_mask filtering_algorithm] [-db_hard_mask filtering_algorithm]
[-subject subject_input_file] [-subject_loc range] [-query input_file]
[-out output_file] [-evalue evalue] [-word_size int_value]
Una opción muy poderosa es la capacidad de encadenar ejecuciones, redireccionando la salida de un comando a la entrada del siguiente comando. Esto es lo que se conoce como tuberías o pipelines. Para redirigir la salida del primer comando hacia el segundo comando, usamos un pipe, cuyo símbolo es |
. Veamos algunos ejemplos.
Vamos a buscar en nuestro historial los últimos comandos que usan la palabra “busco”. Para eso usamos el comando history
, que nos muestra todas las instrucciones guardadas en el historial, y la herramienta grep
, que busca patrones y devuelve las líneas en las que lo encuentra. Vayamos viendo los comandos de a partes:
estudiantes@equipo:~$ history #la salida suele ser muy larga y puede ser difícil encontrar lo que buscamos
estudiantes@equipo:~$ history | grep busco #esto se acerca a lo que queremos, pero busquemos las últimas veces que usamos el comando
estudiantes@equipo:~$ history | grep busco | tail -4
380 busco -i nano.contigs.fasta -o busco.out -l busco_downloads/lineages/saccharomycetes_odb10 -m genome --config Programas/busco/config/config.ini --augustus -f
381 rm -rf busco_2649081714.log
382 rm -rf busco.out/
407 busco -h
Esto es útil cuando no recordamos cómo usar un comando.
Para saber cuantas secuencias tiene un fasta, buscamos las líneas que tienen el carácter “>” con grep
y enviamos la salida al comando wc
(de word count), con el modificador -l
para que nos de sólo el número de líneas. Vamos a usar el fasta que copiamos anteriormente a nuestro home.
estudiantes@equipo:~$ grep ">" refseq_db.faa #esto devuelve los encabezados del fasta, que son las únicas lineas con el carácter ">"
estudiantes@equipo:~$ grep ">" refseq_db.faa | wc -l #cuenta el número de líneas
23492
Notar que el carácter “>” en el comando grep está entre comillas, ya que, como vimos anteriormente, es también el operador de redireccionamiento. Si olvidamos usar comillas, el archivo fasta existente se va a sobrescribir con un archivo vacío.
Vamos a buscar los archivos con mayor tamaño dentro de un directorio. Para eso, listamos los detalles de los archivos del directorio con ls -l
y le pasamos la salida al comando sort
, con las opciones -k 5
para ordenar por la columna 5, que corresponde al tamaño de los archivos, y -n
para ordenar numéricamente.
estudiantes@equipo:~$ ls -l /usr/bin | sort -n -k 5 | tail
-rwxr-xr-x 1 root root 4551912 ene 13 2020 gnome-control-center
-rwxr-xr-x 1 root root 4992936 abr 30 2020 shotwell
-rwxr-xr-x 1 root root 5276200 feb 16 2018 iqtree
-rwxr-xr-x 1 root root 5276200 feb 16 2018 iqtree-omp
-rwxr-xr-x 1 root root 5390888 feb 16 2018 iqtree-mpi
-rwxr-xr-x 1 root root 5893648 jun 24 2019 ubuntu-report
-rwxr-xr-x 1 root root 7619056 oct 30 08:45 gdb
-rwxr-xr-x 1 root root 12441592 abr 26 2016 prodigal
-rwxr-xr-x 1 root root 18369616 oct 17 2018 node
-rwxr-xr-x 1 root root 19428040 feb 2 05:21 snap
Estos son algunos de los comandos y programas más frecuentemente utilizados en Linux.
Comando | Descripción |
---|---|
ls | Listar el contenido del directorio actual |
pwd | Imprime el directorio de trabajo actual |
cd | Cambia el directorio de trabajo |
mkdir | Crea un nuevo directorio |
mv | Mueve y renombra archivos |
cp | Copiar archivos |
rm | Borrar un archivo |
cat | Ver el contenido de archivos, concatenar archivos |
more | Muestra el contenido del archivo página por página |
less | Muestra el contenido del archivo página por página |
head | Muestras las primeras n líneas |
tail | Muestras las últimas n líneas |
echo | Imprime textos a la salida estándar |
wc | Contar líneas, palabras y caracteres |
cut | Corta secciones de cada línea (columnas) |
paste | Une archivos horizontalmente, generando una salida donde cada columna es un archivo de entrada |
sort | Ordena líneas (lexicográficamente, numéricamente) |
uniq | Filtra líneas repetidas |
tr | Cambiar o borrar caracteres |
locate | Encuentra archivos por su nombre, devuelve la ruta absoluta |
grep | Buscar patrones en un archivo |
sed | Editor de flujo de texto. Puede hacer inserción, eliminación, y sustitución de texto |
awk | Poderosa utilidad que permite buscar patrones y procesar textos |
Shortcuts
- Tab Completar al escribir:
Simplemente comience a escribir un comando, nombre de archivo, o directorio, y presione la tecla tab. Bash completará automáticamente lo que está escribiendo si no hay ambigüedades.
- ↑ y ↓ Moverse en el historial:
Los comandos ejecutados son guardados en el historial. Puede acceder a sus últimos comandos con la flecha hacia arriba.
Recuerde que siempre puede buscar en Google si no recuerda la forma de uso de un comando.
También puede acceder a la ayuda de los distintos comandos en la linea de comando. La opción a usar para acceder a la ayuda varía de acuerdo al comando, pero por lo general va a ser --help
, -h
, o -help
. Por ejemplo:
estudiantes@equipo:~$ ls --help | head -5
Modo de empleo: ls [OPCIÓN]... [FICHERO]...
Muestra información acerca de los FICHEROs (del directorio actual por defecto).
Ordena las entradas alfabéticamente si no se especifica ninguna de las
opciones -cftuvSUX ni --sort.
Durante el curso trabajaremos ocasionalmente en un servidor. A este servidor nos conectaremos usando usando el protocolo SSH (por Secure SHell). Este es el nombre de un protocolo y del programa que lo implementa cuya principal función es el acceso remoto a un servidor por medio de un canal seguro.
Para loguearnos al servidor, debemos conocer la dirección IP o el hostname, y tener un usuario en el servidor al que nos queremos conectar. El formato del comando es ssh usuario@servidor
. Por ejemplo:
estudiantes@equipo:~$ ssh estudiantes@rnaseq.fcien.edu.uy
o
estudiantes@equipo:~$ ssh estudiantes@164.73.84.41
En este caso, el nombre del servidor es “rnaseq”. Este es uno de los servidores que vamos a usar en el curso.
La máquina va a responder pidiendo su clave de usuario. La primera vez que intente conectarse al servidor, es probable que vea una advertencia similar a:
The authenticity of host 'rnaseq.fcien.edu.uy (164.73.84.41)' can't be established.
ECDSA key fingerprint is (...)
Are you sure you want to continue connecting (yes/no)?
Su máquina le está diciendo que no reconoce el servidor remoto. Como esta es la primera vez que se conecta, esto es completamente esperado. Teclee “yes” o “y” para continuar.
Una vez se haya conectado, verá que cambia el prompt, mostrando el nombre de la máquina remota y el nombre de su usuario en ella. Por ejemplo:
usuario@rnaseq:~$
Para salir de la máquina remota y volver a la local usamos el comando exit
.
scp
y sftp
scp (secure copy) es un protocolo para copiar archivos de manera segura desde o hacia servidores remotos. scp
no es interactivo y realmente sólo puede copiar archivos, no tiene la capacidad de hacer cosas como listar el contenido de directorios o moverse en el sistema de archivos. Esto determina que para usar el protocolo scp debemos conocer el path de origen/destino en el servidor remoto, ya que debe ser establecido en el comando. Al igual que la herramienta cp
, la forma de uso de scp
es: scp
Para copiar el archivo “refseq_db.faa” hacia el servidor remoto “rnaseq”:
estudiantes@equipo:~$ scp refseq_db.faa usuario@rnaseq:~
Para copiar el mismo archivo desde “rnaseq” a su posición actual en su máquina:
estudiantes@equipo:~$ scp estudiantes@rnaseq:~/refseq_db.faa .
El sistema responderá pidiendo la contraseña del usuario en el servidor remoto.
En ambos casos, para copiar un directorio con todo su contenido usamos scp -r
.
sftp (Secure File Transfer Protocol) es más elaborado y permite una variedad de operaciones en archivos remotos, como listar el contenido de directorios, crear directorios, eliminar directorios y archivos (todos sujetos a permisos del sistema, por supuesto), etc.
Para iniciar una sesión sftp
, ingrese el nombre de usuario y el nombre del servidor remoto o su dirección IP. El sistema nos pedirá el password del usuario en el servidor. Una vez nos autenticamos, el prompt del terminal que antes era usuario\@equipo:~$
, cambia a sftp>
.
estudiantes@equipo:~$ sftp estudiantes@rnaseq.fcien.edu.uy
estudiantes@rnaseq.fcien.edu.uy's password:
Connected to rnaseq.fcien.edu.uy.
sftp>
Puede verificar los comandos disponibles en sftp
tipeando ?
o help
en el prompt.
Durante la sesión sftp
puede ejecutar comandos en la máquina local o en la remota. Para realizar un comando en la máquina local, agregue la letra l
de local o el símbolo !
antes del comando. Por ejemplo, ls
lista el contenido del directorio de trabajo remoto mientras que lls
y !ls
listan el contenido del directorio de trabajo local actual.
Para transferir archivos al servidor remoto desde la máquina local, usamos el comando put
seguido del path local del archivo a transferir. Para transferir archivos desde el servidor remoto, usamos el comando get
seguido del path remoto del archivo a transferir. Para cerrar la sesión sftp
usamos el comando exit
.