terminal

De Wikicima
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Copiado de ficheros)
Línea 1: Línea 1:
La mayoría de usuari.x.s GNU/linux trabajan directamente des de la terminal. Básicamante, su uso facilita y accelera el trabajo.
+
La terminal es una interfaz de línea de comando que permite interactuar con la computadora. Al igual que cualquier GUI (por Graphical User Interface) con la que hayamos trabajado en Windows o Linux, la terminal nos permite acceder a directorios (carpetas) y archivos, generar nuevos archivos y moverlos a otras ubicaciones entre otro millón de cosas.
   
= Terminal =
+
Entonces, ¿porqué "complicarnos" con la terminal si puedo hacer lo mismo con un par de clicks del mouse? Cuando queremos interactuar con la computadora de manera compleja, hacer tareas repetitivas o por ejemplo conectarnos de manera remota con otras computadoras, necesitamos saber usar la terminal.
La terminal otorga una interfaz al usuari.x. mediante la cuál se acceden a los fichero y aplicaciones. En el entorno gráfico <code>Gnome</code>, Se llega a ella a través de buscarla por el menú de actividades cómo <code>Terminal</code>. Se recomienda ponerla en las herrmamientas favoritas.
 
   
[[File:Terminal.png]]
+
= ¿Cómo funciona? =
   
Des de ella se accede a la línea de comandos desde la cuál ejecutamos instrucciones de shell, aplicaciones y programas
+
Al abrir la terminal nos encontramos con una pantalla negra y en la primera linea algo como lo siguiente:
  +
  +
[[Archivo:terminal.png]]
  +
  +
Esto va a ser <code>usuario@nombredelacomputadora:~$</code>. Acá el <code>~</code> indica el directorio raíz y el <code>$</code> o '''prompt''' indica que la shell está esperando instrucciones.
  +
  +
La '''shell''' es un programa que interpreta nuestras ordenes y las traduce en lenguaje computadora. A travez de la shell podemos hacer cosas tan simples como copiar un archivo con un simple comando hasta correr un modelo de simulación numérica.
  +
  +
== Herramientras básicas ==
  +
  +
Las herramientas básicas vienen pre-instaladas con el sistema operativo en en el paquete [https://wiki.debian.org/coreutils coreutils] (o GNU Core Utilities). Por ejemplo:
   
== Ideas básicas ==
 
El sistema operativo se configura a través de unas variables de sistema generales
 
* <CODE>$HOME:</CODE> Ubicación inicial al abrir una terminal cómo usuarix (<CODE>/home/[usuarix]</CODE>)
 
* <CODE>$PATH:</CODE> Directorios que ya están cargados automáticamente al abrir un terminal. Suelen ser directorios con aplicaciones, así no hace falta saber dónde se encuentran las aplicaciones. Por ejemplo:
 
 
<PRE>
 
<PRE>
/home/lluis/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
+
$ ls
  +
  +
Desktop Downloads Movies Pictures Test
  +
Documents Library Music terminal.png
  +
 
</PRE>
 
</PRE>
* <CODE>$LD_LIBRARY_PATH:</CODE> Librerias cargadas en el sistema
 
   
== coreutils ==
+
Este comando lista el contenido dentro del directorio actual. Y su nombre viene de "list". Se puede extender las capacidades de los comandos con '''flags''' usando la siguiente sintaxis:
Las [https://wiki.debian.org/coreutils coreutils] son pequeñas herramientas instaladas por defecto con el sistema, que hacen muy eficientemente operaciones muy sencillas. Hay de distinto tipos: <I>ficheros</I>, <I>shell</I> y <I>texto</I>
 
   
=== Instrucciones básicas ===
 
Las herramientas del <code>coreutils</code>, se utilizan mediante <I>'flags'</I> (normalmente '-flag') que regulan la ejecución de la herramienta
 
 
<PRE>
 
<PRE>
$ [herramienta] -flag1 -flag2 ...
+
$ [comando] -flags
 
</PRE>
 
</PRE>
   
Se accede a la ayuda de la herramienta con: <code>-h --h -help --help</code> (en función de la herramienta)
+
Por ejemplo, si quisieramos más información sobre los archivos y directorios que están en el directorio actual usamos:
  +
 
<PRE>
 
<PRE>
$ [herramienta] --h
+
$ ls -l
  +
  +
.....
 
</PRE>
 
</PRE>
   
O bien en un formato texto con <code>man</code> (sólo aparecerá si se ha instalado la documentación de la aplicación)
+
Existen una infinidad de comandos, cada uno con sus flags y a diferencia de una interfaz gráfica donde tenemos botones, al trabajar en la terminal es necesario conocerlos. Esto se aprende con práctica pero también googleando aquello que queremos resolver.
  +
  +
== Navegando entre directorios ==
  +
  +
Lo primero es saber donde estamos parados dentro de la computadora, para eso existe el comando <code>pwd</code> (que viene de "print working directory"):
  +
 
<PRE>
 
<PRE>
$ man [herramienta]
+
$ pwd
  +
/home/pao
  +
 
</PRE>
 
</PRE>
   
Distintos comandos básicos... (normalmentes nombre fruto de una abreviación...)
+
En este caso estamos parados en el '''home'''. La respuesta de este comando puede ser distinta dependiendo del sistema operativo, pero dentro del mundo de linux no debería variar mucho.
  +
  +
El home es la carpeta principal del usuario, donde se guardará todo. Pero por encima hay toda una estructura de archivos que organizan los programas instalados, las herramientas de sistema y los "homes" de otros usuarios dentro de la misma computadora.
  +
  +
Otra manera de ver donde estamos, es revisando el contenido del directorio con <code>ls</code> y reconoceer así el directorio.
  +
  +
Si queremos "movernos" dentro de la computadora hacia otro directorio, el comando indicado es <code>cd</code> (que vienen de "change directory", para esta altura seguro ya descubrieron el patrón).
  +
  +
Por ejemplo queremos movernos al directorio "Test" (ojo, shell es case sensitive, las mayusculas y minusculas no son intercambiables!):
   
* <code>ls</code>: <I>'list'</I>, lista el contenido de un directorio (un directorio es el equivalente de 'carpeta' de Windows)
 
 
<PRE>
 
<PRE>
$ ls
+
$ cd Test
20160324_bash.pdf install.inf prueba.bash Terminal.png test.bash
 
$ ls -l
 
total 244
 
-rw-r--r-- 1 lluis lluis 221654 Jun 6 10:49 20160324_bash.pdf
 
-rw-rw-r-- 1 lluis lluis 328 Apr 25 14:53 install.inf
 
-rwxr--r-- 1 lluis lluis 114 Jun 6 11:27 prueba.bash
 
-rw-r--r-- 1 lluis lluis 11172 Apr 11 16:27 Terminal.png
 
-rw-r--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash
 
 
</PRE>
 
</PRE>
   
* <code>mkdir</code>: <I>'makedirectoy'</I>, creación de un directorio
+
Este comando no devuelve nada pero si usamos <code>pwd</code>, veremos que ahora estamos en un nuevo directorio.
  +
  +
Para volver al directorio anterior usamos <code>..</code>, es un "directorio especial" que representa el directorio previo o parent directory. También existe un <code>.</code> que representa el directorio actual. Pueden verlos usando <code>$ ls -a</code> para mostrar todos ("all") los elementos en el directorio actual
  +
 
<PRE>
 
<PRE>
$ mkdir parTUXza
+
$ cd ..
  +
</PRE>
  +
  +
=== Path absolutos y relativos ===
  +
  +
En el ejemplo anterior usamos <code>cd</code> para movernos y el nombre del directorio al cual queremos ir. Cómo el directorio Test estaba adentro del directorio de trabajo accedimos sin problemas pero si ubieramos estado en otro lado nos hubiera dicho que no existe un directorio Test. Esto es así porque le estamos dando el path relativo (relativo al directorio donde estamos parados). Pero <code>cd</code> también puede interpretar la ubicación exacta o absoluta de un directorio. Por ejemplo:
  +
  +
<PRE>
  +
$ cd /home/pao/Test
  +
</PRE>
  +
  +
=== Algunos trucos ===
  +
  +
Muchas veces escribimos mal el nombre de un directorio o archivo, a veces son super largos o el path absoluto es enorme. Existen varios atajos para hacernos la vida más simple:
  +
  +
* <code>Tab</code>: La tecla Tab completa el nombre del archivo o directorio. Basta con escribir las primeras letras del nombre y luego con la tecla tab se termina de escribir automáticamente el nombre. [[Archivo:tabKey.png]]
  +
* <code>Ctrl + a</code>: Principio de línea. Se manda el cursos al principio de la línea de comando. También funciona la tecla Inicio.
  +
* <code>Ctrl + a</code>: Final de línea. Se manda el cursos al final de la línea de comando. O también la tecla Fin.
  +
  +
== Manipulando archivos y directoios ==
  +
  +
* <code>mkdir</code>: Para crear directorios usamos el comando <code>mkdir</code> (por supuesto de "make directory"):
  +
  +
$ mkdir Test2
 
$ ls
 
$ ls
20160324_bash.pdf install.inf parTUXza prueba.bash Terminal.png test.bash
+
Desktop Downloads Movies Pictures Test
$ ls parTUXza
+
Documents Library Music terminal.png Test2
 
$
 
$
 
</PRE>
 
</PRE>
   
* <code>cp</code>: <I>'copy'</I>, copiar fichero
+
La ubicación del nuevo directorio dependerá de la ubicación relativa o absoluta que le dimos. En este caso, se creará en el directorio donde estamos trabajando.
  +
  +
* <code>cp</code>: si quisieramos copiar un archivo en otra ubicaación usamos <code>cp</code> (de "copy"). Este comando necesita saber que copiar y donde copiarlo: <code>cp [origen] [destino]</code>, por ejemplo:
  +
 
<PRE>
 
<PRE>
 
$ cp [origen] [destino]
 
$ cp [origen] [destino]
$ cp Terminal.png parTUXza
+
$ cp terminal.png Test
$ ls parTUXza
+
$ ls Test
$ Terminal.png
+
$ terminal.png
 
</PRE>
 
</PRE>
   
* <code>mv</code>: <I>'move'</I>, mover un fichero y/o cambiar el nombre
+
<code>cp</code> tiene una flag <code>-r</code> que permite copiar recursivamente un directorio y su contenido.
  +
  +
* <code>mv</code>: el comando <code>mv</code> ("move") permite mover un archivo (parecido al <code>ctrl+C</code> y <code>ctrl+V</code> en una interfáz gráfica). Pero también permite cambiarle el nombre a un archivo si los "movemos" en el mismo lugar:
  +
 
<PRE>
 
<PRE>
 
$ mv [origen] [destino]
 
$ mv [origen] [destino]
$ mv parTUXza/Terminal.png parTUXza/Terminal2.png
+
$ mv Test/terminal.png Test/terminal2.png
$ ls parTUXza
+
$ ls Test
Terminal2.png
+
terminal2.png
 
</PRE>
 
</PRE>
   
* <code>rm</code>: <I>'remove'</I>, borrar fichero, directorio...
+
  +
* <code>rm</code>: si queremos borrar un archivo usamos <code>rm</code> (de "remove"). Para borrar directorios podemos agregar una flag. Pero cuidado esta acción es irreversible. La terminal no tiene papelera y no existe el <code>Ctrl+z</code>, cuidado con con lo borran!
  +
 
<PRE>
 
<PRE>
 
$ rm [fichero]
 
$ rm [fichero]
$ rm parTUXza/Terminal2.png
+
$ rm Test/terminal2.png
$ ls parTUXza
+
$ ls Test
 
$
 
$
 
</PRE>
 
</PRE>
   
* <code>rmdir</code>: <I>'removedirectory'</I>, borra directorio vacío...
+
* <code>ls</code>: <I>'list'</I>, lista el contenido de un directorio (un directorio es el equivalente de 'carpeta' de Windows)
 
<PRE>
 
<PRE>
$ cp Terminal.png parTUXza
+
$ ls
$ rmdir parTUXza
+
20160324_bash.pdf install.inf prueba.bash Terminal.png test.bash
rmdir: failed to remove 'parTUXza/': Directory not empty
+
$ ls -l
  +
total 244
  +
-rw-r--r-- 1 lluis lluis 221654 Jun 6 10:49 20160324_bash.pdf
  +
-rw-rw-r-- 1 lluis lluis 328 Apr 25 14:53 install.inf
  +
-rwxr--r-- 1 lluis lluis 114 Jun 6 11:27 prueba.bash
  +
-rw-r--r-- 1 lluis lluis 11172 Apr 11 16:27 Terminal.png
  +
-rw-r--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash
 
</PRE>
 
</PRE>
   
* <code>date</code>: manejo de fechas
 
<PRE>
 
$ date
 
Wed Jun 6 12:27:16 -03 2018
 
$ date "+%Y/%m/%d %H:%M:%S"
 
2018/06/06 12:27:21
 
$ date -d"35 days"
 
Wed Jul 11 12:27:27 -03 2018
 
$ date -d"35 days ago"
 
Wed May 2 12:27:32 -03 2018
 
</PRE>
 
   
=== Atributos fichero ===
+
=== Atributos de un archivo ===
Al hacer un list con <code>-l</code>, nos aparecen la lista de atributos del fichero:
+
Al hacer un list con <code>ls -l</code>, nos aparecen la lista de elementos en el directorio con sus atributos:
  +
  +
* <code>ls</code>: lista el contenido de un directorio
   
* <code>ls</code>: <I>'list'</I>, lista el contenido de un directorio (un directorio es el equivalente de 'carpeta' de Windows)
 
 
<PRE>
 
<PRE>
 
$ ls -l
 
$ ls -l
Línea 108: Línea 88:
 
-rwxr--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash
 
-rwxr--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash
 
</PRE>
 
</PRE>
  +
  +
Por ejemplo, el archivo pdf 20160324_bash.pdf tiene los siguientes atributos:
   
 
* <code>-rw-r--r-- 1 lluis lluis 221654 Jun 6 10:49 20160324_bash.pdf</code>, fichero pdf
 
* <code>-rw-r--r-- 1 lluis lluis 221654 Jun 6 10:49 20160324_bash.pdf</code>, fichero pdf
** <I>-rw-</I>: Dueño sólo puede leerlo y modificarlo
+
  +
** <I>-rw-</I>: El dueño del archivo sólo puede leerlo y modificarlo.
 
** <I>r--</I>: El grupo sólo puede leerlo
 
** <I>r--</I>: El grupo sólo puede leerlo
 
** <I>r--</I>: Todo el mundo sólo puede leerlo
 
** <I>r--</I>: Todo el mundo sólo puede leerlo
** <I>lluis</I>: dueño del fichero
+
** <I>lluis</I>: Dueño del archivo
** <I>lluis</I>: grupo del fichero
+
** <I>lluis</I>: Grupo del archivo
** <I>221654</I>: Tamaño en bytes del fichero
+
** <I>221654</I>: Tamaño en bytes del archivo
** <I>Jun 6 10:49</I>: fecha del fichero
+
** <I>Jun 6 10:49</I>: fecha de la última modificación del archivo
* <code>-rwxr--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash</code>: script de shell, sólo el dueñx puede ejecutarlo <code>-rwx</code>
 
* <code>drwxr-xr-x 2 lluis lluis 4096 Jun 6 12:25 parTUXza</code>: directorio (<code>drwx</code>), para linux, los directorios son ejectuables para todxs!
 
   
=== Trucos del terminal ===
+
Otros archivos tiene permisos de ejecución, por ejemplo:
Para ahorrarse teclear demasiado, el terminal tiene ayudas para eso
+
* <code>Tab</code>: <I>Finalización de nombre de fichero</I>. Cuando se escribe un nombre de fichero o directorio, basta con anotar el principio del nombre del fichero, con la tecla tabulador [[Archivo:tabKey.png]] se termina de escribir automáticamente el nombre.
+
* <code>-rwxr--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash</code>: script de shell, <code>-rwx</code> indica que sólo el dueño puede ejecutarlo.
* <code>CTR + a</code>: <I>Principio de línea</I>. Se manda el cursos al principio de la línea de comando
+
* <code>drwxr-xr-x 2 lluis lluis 4096 Jun 6 12:25 parTUXza</code>: directorio (<code>drwx</code>), para linux, los directorios son ejectuables para todos!
* <code>CTR + e</code>: <I>Final de línea</I>. Se manda el cursos al final de la línea de comando
+
  +
== Comodines ==
  +
  +
Los comodines son símbolos o expresiones que actual básicamente como cómodines y te permiten ahorrar tiempo. Por ejemplo <code>*</code> funcionan como cualquier cantidad de caracteres:
  +
  +
<PRE>
  +
$ cp *.png Test/
  +
</PRE>
  +
  +
En este caso todos los archivos que terminen con ".png" serán copiados a la carpeta Test, sin importar que nombre tengan antes del .png.
  +
  +
Hay muchos otros, por ejemplo <code>?</code> es como el <code>*</code> pero solo para un caracter. No es necesario aprenderlos a todos, es cuestión de práctica y a medida que los necesitamos.
  +
  +
== Ayuda ==
  +
  +
Es posible acceder a la ayuda de un comando con una flag específica <code>-h --h --help</code> (esto depende del comando). O en algunos casos, también está disponible la documentación completa a la que se accede con `man`.
  +
  +
<PRE>
  +
$ [comando] --h
  +
$
  +
$ man [comando]
  +
$
  +
</PRE>
  +
  +
== Variables de sistema ==
  +
El sistema operativo se configura a través de unas variables de sistema generales
  +
* <CODE>$HOME:</CODE> Ubicación inicial al abrir una terminal cómo usuarix (<CODE>/home/[usuarix]</CODE>)
  +
* <CODE>$PATH:</CODE> Directorios que ya están cargados automáticamente al abrir un terminal. Suelen ser directorios con aplicaciones, así no hace falta saber dónde se encuentran las aplicaciones. Por ejemplo:
  +
<PRE>
  +
/home/lluis/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
  +
</PRE>
  +
* <CODE>$LD_LIBRARY_PATH:</CODE> Librerias cargadas en el sistema
   
 
= Shell scripting =
 
= Shell scripting =

Revisión de 17:30 9 jun 2019

La terminal es una interfaz de línea de comando que permite interactuar con la computadora. Al igual que cualquier GUI (por Graphical User Interface) con la que hayamos trabajado en Windows o Linux, la terminal nos permite acceder a directorios (carpetas) y archivos, generar nuevos archivos y moverlos a otras ubicaciones entre otro millón de cosas.

Entonces, ¿porqué "complicarnos" con la terminal si puedo hacer lo mismo con un par de clicks del mouse? Cuando queremos interactuar con la computadora de manera compleja, hacer tareas repetitivas o por ejemplo conectarnos de manera remota con otras computadoras, necesitamos saber usar la terminal.

Contenido

¿Cómo funciona?

Al abrir la terminal nos encontramos con una pantalla negra y en la primera linea algo como lo siguiente:

terminal.png

Esto va a ser usuario@nombredelacomputadora:~$. Acá el ~ indica el directorio raíz y el $ o prompt indica que la shell está esperando instrucciones.

La shell es un programa que interpreta nuestras ordenes y las traduce en lenguaje computadora. A travez de la shell podemos hacer cosas tan simples como copiar un archivo con un simple comando hasta correr un modelo de simulación numérica.

Herramientras básicas

Las herramientas básicas vienen pre-instaladas con el sistema operativo en en el paquete coreutils (o GNU Core Utilities). Por ejemplo:

$ ls

Desktop     Downloads   Movies      Pictures      Test
Documents   Library     Music       terminal.png

Este comando lista el contenido dentro del directorio actual. Y su nombre viene de "list". Se puede extender las capacidades de los comandos con flags usando la siguiente sintaxis:

$ [comando] -flags

Por ejemplo, si quisieramos más información sobre los archivos y directorios que están en el directorio actual usamos:

$ ls -l

.....

Existen una infinidad de comandos, cada uno con sus flags y a diferencia de una interfaz gráfica donde tenemos botones, al trabajar en la terminal es necesario conocerlos. Esto se aprende con práctica pero también googleando aquello que queremos resolver.

Navegando entre directorios

Lo primero es saber donde estamos parados dentro de la computadora, para eso existe el comando pwd (que viene de "print working directory"):

$ pwd
/home/pao

En este caso estamos parados en el home. La respuesta de este comando puede ser distinta dependiendo del sistema operativo, pero dentro del mundo de linux no debería variar mucho.

El home es la carpeta principal del usuario, donde se guardará todo. Pero por encima hay toda una estructura de archivos que organizan los programas instalados, las herramientas de sistema y los "homes" de otros usuarios dentro de la misma computadora.

Otra manera de ver donde estamos, es revisando el contenido del directorio con ls y reconoceer así el directorio.

Si queremos "movernos" dentro de la computadora hacia otro directorio, el comando indicado es cd (que vienen de "change directory", para esta altura seguro ya descubrieron el patrón).

Por ejemplo queremos movernos al directorio "Test" (ojo, shell es case sensitive, las mayusculas y minusculas no son intercambiables!):

$ cd Test

Este comando no devuelve nada pero si usamos pwd, veremos que ahora estamos en un nuevo directorio.

Para volver al directorio anterior usamos .., es un "directorio especial" que representa el directorio previo o parent directory. También existe un . que representa el directorio actual. Pueden verlos usando $ ls -a para mostrar todos ("all") los elementos en el directorio actual

$ cd ..

Path absolutos y relativos

En el ejemplo anterior usamos cd para movernos y el nombre del directorio al cual queremos ir. Cómo el directorio Test estaba adentro del directorio de trabajo accedimos sin problemas pero si ubieramos estado en otro lado nos hubiera dicho que no existe un directorio Test. Esto es así porque le estamos dando el path relativo (relativo al directorio donde estamos parados). Pero cd también puede interpretar la ubicación exacta o absoluta de un directorio. Por ejemplo:

$ cd /home/pao/Test

Algunos trucos

Muchas veces escribimos mal el nombre de un directorio o archivo, a veces son super largos o el path absoluto es enorme. Existen varios atajos para hacernos la vida más simple:

  • Tab: La tecla Tab completa el nombre del archivo o directorio. Basta con escribir las primeras letras del nombre y luego con la tecla tab se termina de escribir automáticamente el nombre. tabKey.png
  • Ctrl + a: Principio de línea. Se manda el cursos al principio de la línea de comando. También funciona la tecla Inicio.
  • Ctrl + a: Final de línea. Se manda el cursos al final de la línea de comando. O también la tecla Fin.

Manipulando archivos y directoios

  • mkdir: Para crear directorios usamos el comando mkdir (por supuesto de "make directory"):

$ mkdir Test2 $ ls Desktop Downloads Movies Pictures Test Documents Library Music terminal.png Test2 $ </PRE>

La ubicación del nuevo directorio dependerá de la ubicación relativa o absoluta que le dimos. En este caso, se creará en el directorio donde estamos trabajando.

  • cp: si quisieramos copiar un archivo en otra ubicaación usamos cp (de "copy"). Este comando necesita saber que copiar y donde copiarlo: cp [origen] [destino], por ejemplo:
$ cp [origen] [destino]
$ cp terminal.png Test
$ ls Test
$ terminal.png

cp tiene una flag -r que permite copiar recursivamente un directorio y su contenido.

  • mv: el comando mv ("move") permite mover un archivo (parecido al ctrl+C y ctrl+V en una interfáz gráfica). Pero también permite cambiarle el nombre a un archivo si los "movemos" en el mismo lugar:
$ mv [origen] [destino]
$ mv Test/terminal.png Test/terminal2.png
$ ls Test
terminal2.png


  • rm: si queremos borrar un archivo usamos rm (de "remove"). Para borrar directorios podemos agregar una flag. Pero cuidado esta acción es irreversible. La terminal no tiene papelera y no existe el Ctrl+z, cuidado con con lo borran!
$ rm [fichero]
$ rm Test/terminal2.png
$ ls Test
$
  • ls: 'list', lista el contenido de un directorio (un directorio es el equivalente de 'carpeta' de Windows)
$ ls
20160324_bash.pdf  install.inf  prueba.bash  Terminal.png  test.bash
$ ls -l
total 244
-rw-r--r-- 1 lluis lluis 221654 Jun  6 10:49 20160324_bash.pdf
-rw-rw-r-- 1 lluis lluis    328 Apr 25 14:53 install.inf
-rwxr--r-- 1 lluis lluis    114 Jun  6 11:27 prueba.bash
-rw-r--r-- 1 lluis lluis  11172 Apr 11 16:27 Terminal.png
-rw-r--r-- 1 lluis lluis   4056 Jun  6 10:49 test.bash


Atributos de un archivo

Al hacer un list con ls -l, nos aparecen la lista de elementos en el directorio con sus atributos:

  • ls: lista el contenido de un directorio
$ ls -l
[AtributosDueñx][AtributosGrupo][AtributosTodxs] [ID] [Dueñx] [Grupo] [Tamaño] [Fecha] [NombreFichero]
total 244
-rw-r--r-- 1 lluis lluis 221654 Jun  6 10:49 20160324_bash.pdf
-rw-rw-r-- 1 lluis lluis    328 Apr 25 14:53 install.inf
-rwxr--r-- 1 lluis lluis    114 Jun  6 11:27 prueba.bash
drwxr-xr-x 2 lluis lluis   4096 Jun  6 12:25 parTUXza
-rw-r--r-- 1 lluis lluis  11172 Apr 11 16:27 Terminal.png
-rwxr--r-- 1 lluis lluis   4056 Jun  6 10:49 test.bash

Por ejemplo, el archivo pdf 20160324_bash.pdf tiene los siguientes atributos:

  • -rw-r--r-- 1 lluis lluis 221654 Jun 6 10:49 20160324_bash.pdf, fichero pdf
    • -rw-: El dueño del archivo sólo puede leerlo y modificarlo.
    • r--: El grupo sólo puede leerlo
    • r--: Todo el mundo sólo puede leerlo
    • lluis: Dueño del archivo
    • lluis: Grupo del archivo
    • 221654: Tamaño en bytes del archivo
    • Jun 6 10:49: fecha de la última modificación del archivo

Otros archivos tiene permisos de ejecución, por ejemplo:

  • -rwxr--r-- 1 lluis lluis 4056 Jun 6 10:49 test.bash: script de shell, -rwx indica que sólo el dueño puede ejecutarlo.
  • drwxr-xr-x 2 lluis lluis 4096 Jun 6 12:25 parTUXza: directorio (drwx), para linux, los directorios son ejectuables para todos!

Comodines

Los comodines son símbolos o expresiones que actual básicamente como cómodines y te permiten ahorrar tiempo. Por ejemplo * funcionan como cualquier cantidad de caracteres:

$ cp *.png Test/

En este caso todos los archivos que terminen con ".png" serán copiados a la carpeta Test, sin importar que nombre tengan antes del .png.

Hay muchos otros, por ejemplo ? es como el * pero solo para un caracter. No es necesario aprenderlos a todos, es cuestión de práctica y a medida que los necesitamos.

Ayuda

Es posible acceder a la ayuda de un comando con una flag específica -h --h --help (esto depende del comando). O en algunos casos, también está disponible la documentación completa a la que se accede con `man`.

$ [comando] --h
$
$ man [comando]
$

Variables de sistema

El sistema operativo se configura a través de unas variables de sistema generales

  • $HOME: Ubicación inicial al abrir una terminal cómo usuarix (/home/[usuarix])
  • $PATH: Directorios que ya están cargados automáticamente al abrir un terminal. Suelen ser directorios con aplicaciones, así no hace falta saber dónde se encuentran las aplicaciones. Por ejemplo:
/home/lluis/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
  • $LD_LIBRARY_PATH: Librerias cargadas en el sistema

Shell scripting

La shell es la envolvente del hardware y el kernel del ordenador. El usari.x. accede al kernel y a las componentes del ordenador a través de ella.

Esta shell permite la ejecución de scripts para automatizar esas tareas que sean repetitivas. Estas scripts se pueden programar en distintas shells. En esta introducción se dan detalles de la bash: bourn-again Shell (hay distitnas shells: csh, sh, ksh, ...). En estas shells se pueden utilizar todos los coreutils. Estas scripts constituyen un lenguajde de programación interpreatado que es masivamente utilizando dentro del entorno linux

Estas scripts de shell son programas ejecutables interpretados por el kernel. Así que tienen que tener permiso de ejecución. Se realiza con la aplicación chmod (change mode, cambiar el modo):

$ chmod u+x [ScriptShell]

O bien directamente al llamar <ode>bash</code> (si el script es de bash)

$ bash [ScriptShell]

El ejemplo más senzillo de script, con nombre hola.bash (se elige la extensión .bash, pero no es obligatorio)

#!/bin/bash
echo "Hola mundo!!"
  • Al ejecutarse:
$ ./hola.bash
Hola mundo!!
  • En la primera línea se dice que se va a ejecutar con bash

Conceptos básicos

Utilizando un script test llamado test.bash

  • #: carácter para comentarios
  • ;: carácter para concatenar líneas de código
  • echo: impresión en la terminal
  • Variables: Se utilizan cómo $[NombreVariable] o ${[NombreVariable]}. Se asignan con '=' (sin espacios!!!)
#!/bin/bash

number=3
echo "Numero: "${number}
    • Ejecutando
$ chmod u+x test.bash
$ ./test.bash
Numero: 3
    • Asignación de un valor después de ejecutar un comando (con ``)
fecha=`date "+%Y/%m/%d"`
echo "HOY: "${fecha}
    • Ejecutando
HOY: 2018/06/06
  • IF: Condición
valor='Hola'

if test ${valor} == 'Hola'; then
  echo "Hello !"
else
  echo "Goodbye"
fi
    • Ejecutando
Hello
  • DO: bucles. Repetición de un número de veces una instrucción
hoy=`date +%Y%m%d`

echo "hoy: "${hoy}

i=0
while test $i -le 10; do
  nuevodia=`date +%Y%m%d -d"${hoy} $i days"`
  echo "i: "$i" fecha:"${nuevodia}
  i=`expr $i + 1`
done
    • Ejecutando
hoy: 20180611
i: 0 fecha:20180611
i: 1 fecha:20180612
i: 2 fecha:20180613
i: 3 fecha:20180614
i: 4 fecha:20180615
i: 5 fecha:20180616
i: 6 fecha:20180617
i: 7 fecha:20180618
i: 8 fecha:20180619
i: 9 fecha:20180620
i: 10 fecha:20180621

Más ejemplos en IPSL boot camp Archivo:20160324 bash.pdf y sus ejemplos Archivo:test bash.doc (antes de utilizar, renombrar cómo test.bash y darle atributos de ejecución)

Entorno servidores/clústers

Los servidores y clúster de computación, son otras máquinas, con sus usuarixs y entorno linux. Normalmente se encuentran conectadas a internet y se accede a estas máquinas de manera remota des de otra computadora o llamada 'local'

Se acceden a ellos una vez se obtiene una cuenta de usuarix.

Acceso

El acceso a los clúster de computación (HPC del Inglés) o servidores se accede la mayoría de los casos via ssh

$ ssh [NombreUsuarioenServidor]@[nombreServidor].[domino]

Por ejemplo, el CIMA dispone de un clúster de computación llamado hydra y con el domino cima.fcen.uba.ar, así que el acceso a él seria (Se introduce el pasword, sin que aparezca un cursor):

$ ssh juan.perez@hhydra.cima.fcen.uba.ar
password
[juan.perez@hydra ~]$
  • Una vex en el servidor/clúster el usuarix tiene un entorno linux estándard. Al trbajar en un espacio compartido se pide tener un poco más de cuidado que con la compu personal.
  • Para salir, la instrucción exit
[juan.perez@hydra ~]$ exit
$

Copiado de ficheros

Para copiar ficheros se podrían utilizar herramientas gráficas, pero la experiencia recomienda hacerlo desdel terminal. Para tal caso, existen las instrucciones scp y rsync (más potente y muy útil para sincronizar copias)

$ rsync [NombreUsuarixOrig]@[origen]:[fichero/directorio] [NombreUsuarixDest]@[destino]:[directorio] 
  • [NombreUsuarixOrig]: Nombre del usuarix en la máquina donde se encuentra el fichero o directorio a copiar
  • [origen]: nombre de la máquina y su doiminio ([NombreMaquina].[dominio]) donde se encuentra el fichero o directorio
  • [fichero/directorio]: fichero o directorio a copiar
  • [NombreUsuarixDest]: Nombre del usuarix en la máquina donde se quiere copiar el fichero o directorio
  • [destino]: nombre de la máquina y dominio ([NombreMaquina].[dominio]) a la cuál se quiere hacer la copia
  • [directorio]: nombre de directorio en la máquina destino donde se quiere hacer la copia

Cuando se quiere copiar, siempre nos pedirá la clave de acceso de la máquina remota. El destino o el origen no pueden ser los dos remotos. Uno tiene que ser una máquina local. Cuando es la máqiuna local, no se indica [NombreUsuarx]@[maquina] Si no se indica destino de la copia, se copia directamente en el ${HOME}

  • Copia de un fichero local al $HOME de hydra
$ rsync documento.txt juan.perez@hydra.cima.fcen.uba.ar:
  • Copia de un fichero de hydra del directorio ${HOME}/experimentos/WRFsensSFC/run/ a la máquina en local al directorio ${HOME}/estudios/WRFsensSFC/simulacion/control
$ rsync juan.perez@hydra.cima.fcen.uba.ar:experimentos/WRFsensSFC/run/wrfout_d01_2002-12-01_00:00:00 estudios/WRFsensSFC/simulacion/control
Herramientas personales