¿Qué es un Hashbang(#!)?


Un shell script no es más que un conjunto de comandos almacenados dentro de un archivo. Por lo regular, estos archivos sirven para automatizar tareas de uso diario. Ejemplo de un shell script:

#! /bin/bash

while :

do

who

sleep 600; # Parar por 5 minutos.

done

No existe nada inusual en este script, tan son sólo son un conjunto de comandos que podrían haber sido insertados uno a uno dentro de la línea de comandos. La ventaja de colocar comandos dentro del script van más allá de no tener que tipear los comandos una y otra vez. El script se vuelve una herramienta que puede ser modificada y personalizada fácilmente. Ejemplo del shell script mostrado anteriormente un poco más sofisticado:

#! /bin/bash

#Shell Script para mostrar los usuarios conectados al servidor en un intervalo de 5 minutos.

#Variables

SEGUNDOS=600 # Tiempo a esperar para mostrar usuarios.

while :

do

who

sleep $SEGUNDOS

done

Un Hashbang (#!), comunmente llamado She-Bang en la cabecera de un script, le indica al sistema que el fichero contiene un conjunto de comandos los cuales deberán ser ejecutados por el intérprete especificado. El símbolo #!, es lo que se conoce como un numero mágico de 2 bytes, es decir un marcador especial que define un tipo de archivo.

Seguido del Hashbang, se especifica una ruta. Esta es la ruta que apunta al programa que interpretará los comandos del script. Entonces, este intérprete de comandos ejecutará los comandos empezando desde el renglón que le sigue a la línea donde se especificó el hashbang e ignorando comentarios. Ejemplos:

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f

Cada una de las cabeceras mencionadas especifican un intérprete de comandos diferentes. Nótese que el hashbang especificado debe ser capaz de ejecutar los comandos contenidos en el script, ya que de otra forma no podrá ejecutar dichos comandos y desplegará el mensaje “Command not found”.

El símbolo #! puede ser omitido si el script consiste solamente de un conjunto de comandos genéricos del sistema y no de un grupo de directivas especificas de un shell en particular.

EL COMANDO CHMOD.


Como ya se ha mencionado anteriormente, los permisos pueden especificarse de dos formas:

  • Simbólica
  • Numéricamente

En notificación simbólica, los permisos se especifican con la siguiente sintaxis:

chmod nombreDeArchivo [ Usuarios ] [ Operador ] [ Permisos ]

El primer campo identifica al tipo de usuario al que se le ajustarán los permisos. La siguiente tabla muestra los símbolos utilizados para representar a los distintos tipos de usuarios en el comando chmod:

Si se omite este campo, implícitamente se utilizará a.

El operador identifica de que manera se cambiarán los permisos. La siguiente tabla muestra los diferentes tipos de símbolos utilizados en el comando chmod

El último campo identifica el permiso asignado al usuario. La siguiente tabla muestra los siguientes tipos de permisos que existen para los diferentes ficheros y directorios: 

El permiso s solamente puede ser brindado sobre al usuario propietario del fichero ó al grupo al que pertenece el propietario del archivo. Ejemplos:

Suponga que posee el archivo ficherito y desea cambiar sus permisos.

Se pueden incluir varias claves a la vez separándolas mediante comas sin dejar espacios entre cada clave. Ejemplo:

 andres@debian:$ chmod o-w,u=rx,ug+s ficherito 

De igual forma, todo permiso puede ser representado de una manera octal. El formato octal se utiliza para representar la información de una manera mas simple: todo numero octal combina los privilegios de lectura escritura y ejecución como unidad. La siguiente tabla muestra el significado de los valores numéricos:

Ejemplos utilizando notación numérica:

OPCIONES

 -R: Modifica los permisos de los ficheros recursivamente. Ejemplos:

 andres@debian:$ chmod -R 700 /home/usario  

 andres@debian:$ chmod -R gu+r,o-rwx /tmp/   

de Andrés Alvarado Publicado en Comandos

Linus Torvalds, “Nobel” de Tecnología.


Linus Torvalds, creador de Linux.

Linus Torvalds, creador del kernel del sistema operativo Linux, ha ganado el ‘Nobel’ de tecnología, galardón que concede cada dos años la Academia tecnológica de Finlandia. En ocasiones anteriores se lo llevó el creador de la World Wide Web, Tim Berners-Lee. El otro ganador es Shinya Yamanaka por sus desarrollos sobre las células madre. Ambos compartirán el millón de euros con el que está dotado el premio y que se entregará el próximo 13 de junio.

La institución finlandesa reconoce a Torvalds por la creación de “un nuevo sistema operativo de código abierto que hoy en día utilizan millones de computadoras, smartphones y grabadores digitales de video, como Tivo”. En opinión de la Academia, “los logros de Torvalds han tenido un gran impacto en el desarrollo del software de código abierto, el trabajo en red y la apertura de la Web  para hacerla accesible para millones, si no miles de millones” de personas.

El entonces estudiante de la Universidad de Helsinki creó Linux en 1991. Desde entonces, millones de usuarios de todo el mundo poseen este sistema gratuito y miles de ellos contribuyen a su continuo desarrollo aportando ideas, programas, información sobre fallos del sistema, ayudas, tutoriales…. Actualmente Linux alimenta los teléfonos móviles Android y está en la base de las plataformas tecnológicas de gigantes de Internet como Google. Amazon, Twitter o Facebook. También es el sistema operativo que funciona en la mayoría de los superordenadores, entre otros.

Torvalds, tras conocer la concesión del premio ha declarado: “El software es demasiado importante en el mundo moderno para no ser desarrollado a través de fuentes abiertas”.  Hace ahora un año la Fundación Linux celebró el 20 aniversario del lanzamiento de Linux.

La Academia finlandesa ha elaborado un vídeo,  donde explica el imparable avance de este sistema operativo en el mundo tecnológico en colaboración de su padre, Linus Torvalds:

Fuente: El País
Condecoración Tecnológica 2012: Technology Academy Finland

¿Qué son los permisos?


Todo fichero tiene tres permisos asociados a el, que le indican al sistema quién puede acceder a ese fichero, cambiarlo, o en caso de ser un programa ejecutarlo. Estos privilegios son:

  • Lectura
  • Escritura
  • Ejecución

Estos permisos pueden estar o no activados y tienen un significado diferente tanto para ficheros como para directorios.

FICHEROS

  • Permiso de Lectura: Permite observar el contenido del archivo.
  • Permiso de Escritura: Permite la modificar el contenido del archivo.
  • Permiso de Ejecución: Permite la ejecutar un archivo.

DIRECTORIOS

  • Permiso de Lectura: Permite conocer el contenido de de algún directorio, pero no permite ver información detallada de los ficheros a menos que se tengan permisos también permisos de ejecución.
  • Permiso de Escritura: Permite modificar el contenido del directorio: añadir y eliminar ficheros( siempre que se tengan permisos de escritura sobre estos).
  • Permiso de Ejecución: Permite que el usuario pueda cambiarse al directorio requerido, asi como copiar los ficheros del directorio(siempre y cuando se tengan los permisos de lectura sobre esos ficheros).

Estos permisos están representados en Linux por las letras read, write y execute (lectura, escritura y ejecución, respectivamente). Ejemplos:


PERMISOS Y USUARIOS

Cada uno de estos privilegios pueden ser definidos para tres tipos de usuarios:

  • Usuario propietario del fichero: indican los permisos que tiene el usuario dueño del archivo. El dueño de un archivo es el usuario que creó el fichero por primera vez, aunque es posible que durante la vida de un fichero, su dueño pueda cambiar innumerables veces.
  • Usuarios pertenecientes al mismo grupo que el propietario: indican los permisos que tienen los usuarios que pertenecen al mismo grupo que el usuario propietario del archivo.
  • Permisos para otros usuarios: indican los permisos que tienen los usuarios que no pertenecen al grupo del usuario propietario.

Estos permisos se suelen representar con variantes d e la cadena rwx, donde los permisos aparecen en el orden de usuario, grupo y otros. De manera que si un permiso existe para el usuario, se le pone la letra correspondiente a dicho privilegio. De igual forma, si el permiso no esta activado para el usuario, se pone un guión. Ejemplos:

De igual forma, todo permiso puede ser representado de una manera octal. El formato octal se utiliza para representar la información de una manera mas simple: todo numero octal combina los privilegios de lectura escritura y ejecución como unidad. La siguiente tabla muestra el significado de los valores numéricos:

Los permisos de un fichero o directorio pueden ser modificados por el dueño del archivo o por algún administrador, aunque no tengan permisos de escritura sobre el fichero.

Usualmente junto con los permisos se suele representar el tipo de fichero utilizando un carácter que se coloca antes de los permisos: directorio (d), fichero (), dispositivo de caracteres (c), dispositivo de bloques (b), enlace simbólico (l), etc.

de Andrés Alvarado Publicado en Comandos

Las variables de entorno y el comando export.


Por defecto, solamente existe un tipo especial de variable conocida por todos los subprocesos del sistema: Las variables de entorno.

Existen varias razones importantes por las cuales las variables de entorno deben ser conocidas por estos procesos y es que estas variables definen el comportamiento del ambiente sobre cual el usuario esta trabajando. Por ejemplo algunas de estas variables son:

Cualquier variable puede convertirse en una variable de entorno. Para que esto sea posible, la variable primero debe ser definida y posteriormente debe ser transferida al entorno. Ejemplo:

usuario@Linux:~$ nombreUno=”Esta es una variable de entorno”
usuario@Linux:~$ export nombreUno


EL COMANDO EXPORT

El comando export se utiliza para transferir el valor de una variable para que pueda ser accesible a todos los subshells (subprocesos). Su sintaxis es la siguiente:

usuario@Linux:~$ export nombreVariable

Tanto la definición como la exportación pueden lograrse en un sólo paso. Ejemplo:

usuario@Linux:~$ export variableDos=”2”

Incluso puede exportarse más de una variable a la vez. Ejemplo:

usuario@Linux:~$ export variableTres=”Tres” variableCuatro=”Four”

De igual forma, de no especificarse algún argumento para el comando export, este desplegará todas las variables definidas en el ambiente.

Las variables de entorno son importantes y sus valores pueden cambiar dependiendo del shell que se este utilizando. Es decir que probablemente una Korn Shell no tenga las mismas Variables que una Bourne Again Shell.

Las variables de ambiente son importantes. Muchas de las variables de entorno son definidas o redefinidas en archivo .profile dentro del directorio /home/nombreDeUsuario para adecuar el sistema a las necesidades del usuario.

EJERCICIOS

  1. Asigne el valor 3 a la variable raton. Exporte esta variable al ambiente.
  2. Verifique que la variable se encuentre definida dentro de las variables de ambiente.
  3. Despliegue en pantalla el valor de la variable ratón.
  4. Asigne el valor de Miau Miau a la variable gato. Exporte esta variable al ambiente.
  5. Verifique que la variable gato se encuentre definida dentro de las variables de ambiente.
  6. Despliegue en pantalla el valor de la variable gato.
  7. Asigne el valor de Woof Woof a la variable perro . Exporte la variable al ambiente.
  8. Verifique que la variable perro se encuentre definida dentro de las variables de ambiente.
  9. Retire el valor de todas las variables asignadas en estos ejercicios.
  10. Verifique que ninguna de estas variables estan definidas dentro del ambiente.
de Andrés Alvarado Publicado en Comandos

Kernel de Linux, un proyecto colaborativo que mueve al mundo.


En nuestro día a día usamos servicios y sistemas que se apoyan en Linux como sistema operativo y, aunque algunos puedan pensar que su uso no está muy extendido, Linux está presente en muchos más sitios de los que algunos puedan pensar: dispositivos Android, millones de servidores web, grandes players de la red como Google, Facebook o Amazon, TPVs de comercios, sistemas de cartelería digital… El Kernel de Linux es un proyecto en constante evolución en el que han participado, desde 2005, más de 8.000 desarrolladores de todo el mundo que contribuyen al crecimiento del kernel gobernados por Linus Torvalds, que ejerce de benévolo dictador del proyecto. La Linux Foundation ha publicado un informe que muestra la buena salud de la que goza el proyecto y su actividad en el ultimo año y, para acompañar el documento, han publicado un interesante video introductorio que ayuda a comprender un poco mejor el funcionamiento del proyecto.

Tras 20 años de funcionamiento, el proyecto del kernel de Linux goza de una salud envidiable que, claramente, demuestra que el proyecto tiene vida para rato. Hasta la fecha, unos 8.000 desarrolladores han contribuido al proyecto de los cuales 1.000 desarrolladores se han incorporado en este último año con una media de un parche incluido en el kernel por cada 3 desarrolladores que han participado en el proyecto. Esta comunidad tan activa, según los informes, está liderada por una serie de 10 desarrolladores que en los últimos 5 años han aportado un 9% del trabajo total de desarrollo del kernel (que supera los 15 millones de líneas de código) y, extendiendo un poco más el campo, el 20% del kernel ha sido desarrollado por los 20 desarrolladores más activos del proyecto.

.

Como bien se explica en el vídeo, cada una de las contribuciones pasa a ser analizada por un desarrollador senior en dos fases; una primera para aceptar o descartar la propuesta y una en profundidad para analizar el código aportado. Tras las dos validaciones, la propuesta pasa a ser evaluada por el mismísimo Linus Torvalds y su equipo de confianza que son los que dan la validación final y deciden qué contribuciones son las que se incluirán en la siguiente versión del kernel.

Un dato interesante, sobre todo para derribar viejos mitos, es la activa participación de las empresas en el desarrollo de Linux (sirva como ejemplo el kernel 3.2 en el que participaron 226 empresas) entre las que se encuentran Red Hat, Novell, Intel, IBM, Oracle, Nokia, Google, HP, Cisco, Fujitsu, Samsung o Microsoft. ¿Microsoft? Pues sí, aunque pueda sorprender a muchos, los de Redmond ocupan el lugar número 17 de empresas que más han contribuido al desarrollo de Linux (con 688 aportaciones durante el último año).

El modelo de desarrollo colaborativo del kernel que, prácticamente, funciona como una factoría que funciona las 24 horas del día los 7 días de la semana permite que el desarrollo sea rápido y el kernel evolucione a un ritmo medio de 70 días por cada versión, una tasa que difícilmente pueden alcanzar otros sistemas operativos.

¿Qué son las variables?


Las variables son la manera en la cual los lenguajes de programación representan información. Una variable no es más que un nombre asignado a una ubicación o grupo de ubicaciones en memoria que guardan algún valor.

La sintáxis para definir una variable es la siguiente:

usuario@Linux:~$ nombreDeVariable=valor

Tal y como se muestra en el ejemplo, no deben existir espacios en ninguno de los dos lados de la igualación. En caso de que el valor para una variable necesite ser constituido por uno o más espacios, este debe estar entrecomillado. Ejemplos:

usuario@Linux:~$ variable2=”Hola Mundo,”
usuario@Linux:~$ variable3=’ ¿como te encuentras hoy?’

Para obtener el valor de una variable, se pueden utilizar los signos $ ó ${}. A este proceso de intercambiar el nombre de una variable por su valor se conoce como sustitución de variables. Ejemplo:

echo $variable2 ${variable3}

Arrojará como resultado:

Hola Mundo, ¿como te encuentras hoy?

La instrucción unset, se utiliza para eliminar el valor de alguna variable. Esto dejará a la variable sin valor alguno, es decir tendrá un valor nulo. Ejemplo:

usuario@Linux:~$ unset variable2

Arrojará como resultado: 


EJERCICIOS

  1. Asigne el valor 3 a la variable raton.
  2. Despliegue el valor de la variable raton en pantalla utilizando los operadores $ y ${}.
  3. Remueva el valor de la variable raton.
  4. Despliegue el valor de la variable raton. ¿Cuál es el resultado?
  5. Despliegue el valor de la variable gato. ¿Qué se puede deducir de este ejercicio?
  6. Asigne el valor de Miau Miau a la variable gato utilizando comillas dobles.
  7. Asigne el valor de Woof Woof a la variable perro utilizando comillas simples.
  8. Despliegue en pantalla el valor de las variables gato y variable perro utilizando los operadores $ y ${}.
  9. Borre los valores de las variables perro y gato.
  10. Intente eliminar el valor de la variable raton de nuevo. ¿Qué se puede deducir de este ejercicio?

El redireccionamiento de entrada y salida.


Cuando un comando se ejecuta, por defecto utiliza los mismos dispositivos de entrada y salida que el shell sobre el cual se está ejecutando. Estos dispositivos son normalmente la pantalla y el teclado, sin embargo, estos dispositivos pueden ser sustituidos por otros. A este aspecto de de cambiar la entrada y salida estándar por otros dispositivos, se conoce como redirección de entradas y de salidas. Existen tres tipos de redireccionamiento:

El Redireccionamento de Salida Estándar permite que en vez de que el resultado de un comando se muestre en pantalla, se pueda almacenar en un archivo u otro dispositivo. Existen dos posibilidades para redireccionar la salida:

1. Crear un archivo nuevo con el contenido de la salida mediante el operador > seguido del nombre del archivo o dispositivo a donde irá a parar la información. Ejemplo:

usuario@Linux:~$ man cat > archivoRedirigido 

Como se puede apreciar, en vez de escribir la información acerca del comando cat en pantalla, el comando crea un archivo totalmente nuevo en el directorio actual.

2. Añadir el contenido de la salida a un archivo ya existente (o crearlo de no existir). En este caso se utilizan dos signos >> antes del nombre del fichero. Ejemplo:

usuario@Linux:~$ pwd >> archivoRedirigido

Como se puede observar, el comando añadirá la ruta del directorio actual de trabajo al final del archivo informacionCat en vez de escribir la información del directorio actual en pantalla.

El Redireccionamiento de la Entrada Estándar le permite al comando leer la información a procesar desde un fichero u otro dispositivo en lugar de leer los datos directamente desde el teclado. Para redireccionar la entrada estándar, se utiliza el operador seguido del nombre de fichero o dispositivo de donde tomará la información. Ejemplo:

usuario@Linux:~$ more < archivoRedirigido 

Es claro que muchos comandos permiten especificar un fichero sobre el cual trabajar, así que en operaciones diarias, el caracter < no se utiliza tanto.

EJERCICIOS

  1. Liste el contenido del directorio /etc/ a un archivo de nombre ejercicio1.
  2. Añada el nombre del directorio actual de trabajo al archivo ejercicio1.
  3. Visualice el contenido del archivo ejercicio1 utilizando el operador <.
  4. Liste las primeras 5 líneas del archivo /etc/passwd a un archivo de nombre contrasenia.
  5. Añada las ultimas 5 líneas del archivo /etc/passwd al archivo contrasenia.
  6. Sustituya toda información del archivo ejercicio1 con la del archivo contrasenia.
  7. Visualice la información del archivo ejercicio1 utilizando el redireccionamiento estándar.
de Andrés Alvarado Publicado en Comandos

Los comandos basename y dirname.


Los sistemas Unix y Linux proporcionan instrucciones para construir nombres de archivos y directorios a partir de rutas absolutas o relativas. Por ejemplo, suponga que posee la siguiente ruta y quisiera conocer únicamente el nombre del archivo o el directorio en el cual se localiza el fichero:

usuario@Linux:~$ /usr/bin/vi

ARGUMENTOS

La órden basename se utiliza para extraer los directorios de una ruta especificada como argumento y despliega en pantalla solamente el último componente de este camino. Ejemplos:

usuario@Linux:~$ basename /usr/bin/vi
usuario@Linux:~$ basename /usr/lib/perl
usuario@Linux:~$ basename /etc/shells
usuario@Linux:~$ basename .

Arrojan como resultado:

vi
perl
shells
.

Por otra parte, la instrucción dirname proporciona sólo la sección de directorio suprimiendo el nombre del archivo. Ejemplos: 

usuario@Linux:~$ dirname /usr/bin/vi
usuario@Linux:~$ dirname /usr/lib/perl
usuario@Linux:~$ dirname /etc/shells
usuario@Linux:~$ dirname .

Arrojan como resultado:

/usr/bin
/usr/lib
/etc
.

EJERCICIOS

  1.  Obtenga el nombre y directorio para la ruta /etc/shells.
  2. Obtenga el nombre y directorio para la variable $HOME.
  3. Obtenga el nombre y directorio para la ruta estaRutaNoExiste/estaTampoco.
  4. Obtenga el nombre y directorio para la ruta /etc/hosts.
  5. Obtenga el nombre y directorio para la ruta ./../...
  6. Obtenga el nombre y directorio para la ruta estaRutaNoExiste.
  7. Obtenga el nombre y directorio para la ruta ~.
de Andrés Alvarado Publicado en Comandos

La entrada y salida estándar.


Por convención, todo programa en plataformas Unix o Linux posee tres canales básicos por donde fluye la información, estos canales son:

  • Salida Estándar
  • Entrada Estándar
  • Error Estándar

La Entrada Estándar, en inglés standard input(mejor conocido como stdin) es el mecanismo por el cual un usuario le indica a los programas la información que estos deben procesar. Por omisión, el teclado es la entrada estándar. Ejemplos:

usuario@Linux:~$ cat
usuario@Linux:~$ wc

Como se puede apreciar, al ejecutar estos ejemplos sin argumentos, el comando espera a que el usuario inserte información para posteriormente procesarla, dicha información de entrada debe ser proporcionada por la entrada estándar, en este caso por el teclado.

La Salida Estándar, en inglés standard output(mejor conocido como stdout) es el método por el cual el programa puede comunicarse con el usuario. Por default, la salida estándar es la pantalla donde se ejecutaron las instrucciones. Ejemplos:

usuario@Linux:~$  ls -l /etc/hosts /etc/passwd
usuario@Linux:~$ head -10 /etc/shells

Al terminar de procesar la información proveída por los argumentos, el programa desplegará un mensaje en la pantalla donde fue ejecutado. Dicha pantalla o ventana será la salida estándar del programa ejecutado.

Por último existe un flujo conocido como Error Estándar, en inglés standard error output(mejor conocido como stderr) que es utilizado por las instrucciones para desplegar mensajes de error que surgan durante el transcurso de su ejecución. Al igual que stdout, el error estándar será la pantalla donde se procesaron las instrucciones. Ejemplos:

usuario@Linux:~$ rm esteArchivoNoExiste
usuario@Linux:~$ rmdir /carpetaInexistente

De igual forma, stderr desplegará mensajes que indicarán al usuario cuando algo ocurra de una manera errónea. 

de Andrés Alvarado Publicado en Comandos