1- La Shell

  • La Shell
  • Usuarios
  • La Linea de Comandos
  • The Bourne Again Shell (bash)
  • Terminales Virtuales
  • Resumen

    La Shell

    Lo que ocurre internamente en la máquina cuando ejecutamos un programa, ya sea uno para leer un archivo, montar o desmontar la unidad de CDROM, en genereal la ejecutación de cualquier tipo de programa que nos permita realizar una tarea x, se realiza un proceso bastante complejo y para que estas se realicen se requiere de una serie de acciones internas por parte del sistema operativo. Como si lo anteriormente dicho no fuera bastante, también encesitamos una forma de poder comunicarnos con nuestro sistema operativo para decirle que es lo que queremos y no queremos que haga. Y es aquí donde entra la impresindible función de un intérprete de comandos (o shell) para realizar esos trabajos. Un intérprete de comandos o shell es el encargado de traducir los comandos que los usuarios introducen, a instrucciones que el sistema operativo pueda comprender para así realizarlas. El programa que se encuentra entre el sistema operativo y el usuario el que nos hace la vida más fácil.

    Si tú eres un usuario que tiene interes en profundizar en un sistem Unix/Linux tarde o temprano ( mientras mas temprano mejor ) deberá introducirce y familiarizarse con el shell de su sistema, el cual es y se convertirá en una, no mejor dicho en la herramienta impresindible en la administración diaria del sistema, tanto por su potencia como versatilidad.

    Y siempre ten presente esto: "Todo lo que se puede hacer en modo gráfico, se puede hacer también en modo texto, a base de comandos. Pero no todo lo que se puede hacer en modo texto, se puede hacer en modo gráfico".

    De aquí en adeltante nos concentraremos en el intérprete de comandos Bourne Again shell ( mejor conocido como Bash ), ya que este es uno de los interpretes más utilizados y extendidos usados por defecto en Slackware y en muchas otras distribuciones linux. Esto se debe a que es potente, fiable y también incorpora algunas característica de Korn y C shells (ksh and csh).

    Ahora me gustaría darles a conocer brevemente la historia sobre bash. El Bourne Again shell (mejor conocido como Bash) fue creado con la finalidad de utilizarlos en el proyecto GNU. La intención fue que este fuera el intérprete de comandos estandar en el sistema GNU. El Bourne Again shell "nació" oficialmente un domingo, 10 de enero de 1988. El responsable de las primeras versiones de Bash fué Brian Fox y que posteriormente continuó actualizándolo hasta 1993. En los inicios de 1989, Chet Ramey comenzó a ayudar a Brian y fué el responsable de muchos arreglos en el código y nuevas características.
    Hoy en dia el mantenedor oficial de bash es Chet Ramey.


    Usuarios

    El inicio de sesión

    Después de un momento de haber iniciado el sistema  ( al final de la carga de todos los datos del sistema ) usted a de estar mirando algo como esto:

       Welcome to Linux 2.4.20 (tty1)
       darkstar login:

    Primero aclararé unas cosillas. La primera línea nos da la bienvenida a Linux y nos dice que estamos usando el kernel versión 2.4.20 y que además nos encontramos en el primer terminal de ocho. En la segunda línea nos dice nuestro hostname el cual es darkstar ( este hostname el es por default, pero si nosotros indicamos otro durante la instalación aparecerá ese) y la palabra login significa que ahi debemos introducir el nombre del usuario el cual queremos iniciar una sesión, ¿simple no ?

    Ahora, como se supone es nuestro primer inicio de sesión después de haber instalado el sistema debemos entrar como root ( o super usuario ). Luego de teclear root en la parte correspondiente al login nos pedirá la password, la cual no se verá al momento de teclearla, pero sí se está escribiendo ( esto es como una medida de seguridad) aquí debemos introducir la password que le indicamos al sistema practicamente al final de la instalación, pero si no le indicamos ninguna simplemente presionamos <ENTER> y ya estaremos dentro.

    Root: El Superusuario

    Tanto en Unix como en otros sistemas operativos tales como Linux, hay una gran variedad de usuarios los cuales son comandados por un usuario supremo mejor conocido como root. Este usuario tiene la particularidad que es todo poderoso ante el sistema y los usuarios que pertenecen a él. Es el cabecilla de todos los usuarios de la máquina, que ejerce una labor meramente administrativa, manteniendo la seguridad del sistema y la de sus usuarios para que este funcione correctamente. Entonces podemos decir que usted, sí usted es el root del sistema, lo que significa como han podido notar un gran poder sobre el sistema, lo que conlleva una gran responsabilidad, porque de ahora en adelante cualquier perjuicio o beneficio que tenga el sistema o sus usuarios sera meramente responsabilidad de usted.

      Por razones de seguridad lo recomendado es crear un usuario y cuando se necesite hacer alguna actualización de software, hardware o algún arreglo significativo para el funcionamiento del sistema la mejor opción es ejecutar el comando su(1). Este comando nos pedirá la password de root y así nosotros seremos un usuario con privilegios de root en el sistema. Y para salir de root cuando antes éramos usuarios normales simplement tecleamos exit(2) y dejarémos de ser usuarios con privilegios en el sistema y quedaremos nuevamente como el usuario normal.


    La Linea de Comandos

    Ejecutando Programas

    Es dificil obtener mucha complicidad sin ejecutar un programa: you might be able to prop something up con tu computadora o una antigua puerta abierta, y algo creara el ruido mas encantador cuando se ejecute, pero de eso es lo que realmente se trata. Y creo que todos estarán de acuerdo that use as a humming doorstop isn't what brought the personal computer the popularity it now enjoys.
    It's hard to get much accomplished without running a program; you might be able to prop something up with your computer or hold a door open, and some will make the most lovely humming noise when running, but that's really about it. And I think we can all agree that its use as a humming doorstop isn't what brought the personal computer the popularity it now enjoys.

    Entonces, ¿Recuerdas qué casi todo en Linux es un archivo? Bien, eso va por los programas también. Cada orden que usted ejecuta (que no está incluida en el shell) reside en algún archivo en alguna parte. Usted ejecuta un programa simplemente especificando la ruta completa hasta el.

    Por ejemplo, ¿recuerda el comando su(1) de la sección anterior?, b ien, realmente el archivo su reside en el directorio /bin/. Entonces usted se estará preguntando, ¿ por qué entonces solo bsata con escribir su para que este funcione?.Y bueno la respuesta a esta interrogante es simplemente porque eso queda en la PATH , osea la ruta de entorno variable PATH. La mayoria de los tipos de shell ya conocen la ruta o algo parecido a la ruta PATH. Esto significa básicamente que contiene una lista de directorios para buscar los programas que intentas ejecutar tan solo teclenado el nombre. Así, cuando usted ejecuta el comando su, el shell busca a través de su lista de directorios o PATH, verificando cada archivo ejecutable que se llame su ejecutando el primero que encuentra. Esto es lo que ocurre siempre que ejecutamos un programa simplemente escrbiiendo su nombre (osea sin especificar la ruta completa hasta el prgorama en cuestión).

    Ahora si tecleamos el nombre de un programa y resulta que se nos muestra un error que de tipo "command not found", esto significa que el programa que usted intenta ejecutar no se encuentra en su ruta indicada o en la PATH o que simplemente no existe. Más adelante explicaremos la variable de entrono con una mayor profundidad ( en la sección llamada The Bourne Again Shell (bash) ).

    También se puede especificar la ejecución de un programa anteponiendole un punto y slash seguido del comando ( osea asi: ./comando ) donde "." es la ruta corta para" el directorio en el que nos encontramos"- Osea que si nos encontramos en el directorio /bin, ./su funcionará como una ruta explicita completa.

    Comodines

    L a gran mayoría de las shell`s aceptan ciertos caracteres como sustitutos o abreviaciones que significan "algo va aquí". Esos caracteres se conocen como "wildcards" o comodines. Entre los más comunes tenemos: *( asterisco ) y ? ( signo de pregunta). Por convención, ? solamente sive para indicar un solo caracter desconocido. Por ejemplo, supongamos que deceamos mover los archivos slack1.c, slack2.c y slack3.c que se encuentran en el directorio /home/usuario/ al directorio /tmp/, utilizando el comando mv sería asi: mv /home/usuario/slack1.c /tmn/ , mv /home/usuario/slack2.c /tmn/ y mv /home/usuario/slack3.c /tmn/ . Como te haz de haber dado cuenta no es complicado, pero aveces puede ser algo tedioso, entonces nos queda mucho más facil de teclear mv /home/usuario/slack?.c /tmp/. Aquí lo que ocurre es que el simbolo ? coincide con los caracteres 1,2 y 3, siendo cada uno sustituido por el signo.

    Ahora te haz de estar diciendo ¿que pasa si son muchos más archivo que no son nisiquiera parecidos ?, entonces yo les digo: usamos el comodín * ( asterisco). Como se mencionó unos renglones arriba, * coincide con "cualquier caracter y número de caracteres incluyendo 0". Por ejemplo, si esos tres archivos ( slack1.c, slack2.c y slack3.c) fueran los únicos en el directorio, nosotros podríamos haber teclear mv * /tmp/ y eso seria todo. Suponga, sin embargo, que hay también un archivo llamado example.txt y uno llamado hejaz.txt. Nosotros queremos copiar example.txt pero no hejaz.txt; entonces tecleamos esto: mv example? /tmp/ o esto otro :mv exa* /tmp.

    Input/Output Redireccionamiento y tuberias

    Ya que nos hemos introducido breve y basicamente el el interprete de comandos bash, procederé a mostrarle otras de sus caracteristicas. Primero veremos redireccionamiento input/output ( redireccionamiento de entrada/salida) lo que se reduce brevemente a esto:

      $ df -h > espacio_en_disco.txt

      Lo que ocurre en esa línea es que, ejecutamos el comando dmesg,  el que nos muestra las particiones que tenemos montadas en el sistema y detalles sobre su espacio . El signo ">" es el redireccionador que usamos para que la salida ( u output) de df -h quede en el archivo espacio_en_disco.txt. Ahora veremos otro ejemplo de otra de las caracteristicas de bash.

      $  ps | less

    Lo que este comando hace es tomar la salida (el output) de ps y se podría decir que lo entuba, para que yo pueda ser leido y recorrerlo a mi antojo. Ahora veremos un ejemplo de " >>" :

      $ ps >> ps.txt

    Este es uno de los redireccionadores más usados. Este hace lo misma que ">", excepto que ">>" escribira la salida de ps en el archivo psp.txt. Si este archivo existe, entonces ">>" escribirá el output ( o salida) de ps al final del contenido del archivo ps.txt -

    Tambien existe el operador "<" que significa "tome como entrada lo siguiente ", pero no se usa tan a menudo.

      $ fromdos < dosfile.txt > unixfile.txt

    Redireccionar se torna divertido cuando usted empieza a mezclar los operadores:

      $ ps | tac > > ps.txt

    Eso ejecutar ps, invertirá las líneas de su salida y añadirá aquello  al final del contenido del archivpo ps.txt. Estos operadores pueden ser utilizados tantos como usted quiera, solo debe tener en cuenta que estos se leen de izquierda a derecha.

    Para una mayor información sobre bash(1) revise el manual de este.


    The Bourne Again Shell (bash)

    Variables de Entorno

    Una variable de entorno simplemente es un nombre asociado a una cadena de caracteres. La utilidad puede ser variada, pero de esto depende de la variable. Unas son útiles para no tener que escribir muchas opciones al ejecutar un programa y otras las utiliza el propio shell (PATH, PS1,etc).

    Linux es un sistema muy complejo complejo y hay que estar pendiente de muchas cosas. Muchos y pequeños detalles que están en juego en su interacción normal con variados programas. Supongo que nadie quiere estar pasando una gran cantidad de opciones a cada uno de los programa que ejecuta, diciendo que tipo de terminal está usando, el hostname de la màquina, como debe lucir el prompt y así una infinidad de detalles más.

    Como un mecanismo de copiado, los usuarios tenemos a nuestra disposición algo que se llama ambiente. El ambiente define las condiciones en las que se ejecutan los programas, y algunas de estas definiciones son variables; el usuario puede alterarlas y/o combinarlas, como solo se ofrece en un sistema Linux. Gran parte de las shell`s tendrán variables de entorno ( pero, sino es así puede que ese tipo de shell no sea muy útil que digamos). En estos momentos daremos un vistazo al shell de forma global y de las ordenes que mantiene usando sus variables de entorno.

    Set

    Su sintaxis es:

    set varName ?value?

    Este comando nos devuelve el valor de varName . Si value  es especificado, entonces set da el valor de varName a value,  creando una nueva variable si esta no existe con anterioridad, devolviendo así su valor. Si varName comienza con un parentesis abierto y termina con uno cerrado, entonces se refiere a un elemento del arreglo: antes del primer caracter del paréntesis abierto es el nombre del arreglo, y los caractéres entre el paréntesis son el índice dentro del arreglo. Si no, varName se referirá a una variable escalar.Normalmente, varName es incompetente (ya que no incluye los nombres de cualquiera que contenga espacios en su nombre), y la varaible de ese nombre en el actual namespace es leido o escrito.
     
    El comando set por defecto nos muestra todas las variables de entorno actualmente definidas y sus respectivos valores. Como la mayoría de los bash también puede hacer otras cosas( con parámetros adicionales),sin embargo, si quieres más información a respecto dejaremos que leas la página bash(1) del manual. Un extracto de una configuración de comandos set seria mas o menos así:

       # set
       PATH=/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
       /usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
       /usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin
       PIPESTATUS=([0]="0")
       PPID=4978
       PS1='\h:\w\$ '
       PS2='> '
       PS4='+ '
       PWD=/home/logan
       QTDIR=/usr/local/lib/qt
       REMOTEHOST=ninja.tdn
       SHELL=/bin/bash

    Aquí claramente se pueden apresiar las PATH definidas en el archivo. Lo que significa que estemos donde estemos con solo teclear el nombre de alguno de los binarios que se encuentren en esas rutas se ejecutarán sin problema

    unset

    Su sintaxis es:

     unset ?-nocomplain? ?--? ?name name name ...?

    Este comando remueve una o varias variables. Cada "name" es el nombre de la variable, especificado en cualquiera forma acpetable por el comando set. Si un "name" se refiere a un elemento de un arreglo entonces este elemento es removido sin afectar el resto de los demás arreglos. Si un "name" consiste en un nombre de arreglo sin un indice como paréntesis, entonces el arreglo entero es borrado. El comando unset devuelve como resultado un comienzo de cadena. Si "-nocomplain" es especificado en el primer argumento, cualquier error posible es descartado. Pero generalmente utilizarás unset así:
     
      $ unset VARIABLE
     
    export

    Su sintaxis es:

    export [-nf] [name[=value] ...]
    o
    export -p

    El comando export es verdaderamente hábil. Usted puede darle un valor cualquiera a la variable de entorno VARIABLE, si VARIABLE no existe entonces será creada. Ahora, si VARIABLE ya tuviese un valor predefinido, entonces este valor será sustituido por el indicado en export. Lo que se vería más o menos así:

     $ export VARIABLE=some_value

     Esto, no es recomendable usarlo si usted quiere agregar una simple nueva ruta a su PATH. Pero si usted quiere agrar una nueva ruta a su PATH lo mejor es hacer algo así :

       $ export PATH=$PATH:/some/new/directory

    Note el uso de $PATH cuando usted quiere que el bash una variable (Remplazarla con ese valor), coloque el simbolo $ en el comienzo del nombre de la variable. Por ejemplo echo $PATH mostrara el valor de la variable PATH, que en mi caso es:

      $ echo $PATH
       /usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin

    Completacion con TAB

    Una línea de comandos muchas veces, si esta es demaciada mecanografía puede llegar a ser algo tedioso. Porque una mucha mecanografia es trabajo y bueno, a nadie le gusta el trabajo. Pero para que ese trabajo de teclear diferentes comandos con sus respectivas rutas y otros detalles bash nos ofrece una gran ventaja y alivia, el cual podemos denominar "completación con la tecla tab", sí como lo lee, bash nos proporciona esta gran ventaja la cual consiste en basicamente que cuando estamos tecleando el nombre de un archivo que por ejemplo se llama slackware y que se encuentra en la raíz, entonce snosotros tecleamos /slack + TAB y nos autocompleta /slackware. Si existen más archivos en  la raíz que comiencen por slack, entonces al presionar tab nos mostrará una lista de los archivos y nosotros podremos teclear un par de caraacteres más que diferencien esos archivos que comienzan igual y presionar tab nuevament ey este se nos autocompletará. Como te haz podido dar cuenta estp de la autocompletación es muy eficaz, no ahorra trabajo y hace que la consola no sea tan tediosa.


    Terminales Virtuales

    Así que usted esta en la mitad de un trabajo y decide que necesita hacer otra cosa. ¿Usted podría dejar lo que usted estar haciendo y cambiar las tareas, pero esto un sistema multiusuario, correcto? ¿Y usted puede entrar simultáneamente las veces que quiera, correcto? ¿Así que por que tiene que hacer una cosa a la vez?

    Todos Nosotros no podemos tener multiples teclados, mouses y monitores en una sola maquina; lo mas seguro es que ningun de nosotros los quiera. Claramente, el hardware no es la solución. Eso nos deja el software, y Linux trabaja para eso, proporcionando "terminales virtuales", o "VTs".

    Apretando Alt y una tecla de función, usted puede cambiar entre los términales virtuales; cada tecla de función corresponde a uno. Slackware tiene inicios de sesión por defecto en 6 VTs. Alt+F2 lo llevaran al segundo, Alt+F3 al tercero, etc.

    El resto de las teclas de función esta reservado para las sesiones de X. Cada sesión de X usa su propio VT, empezando con el séptimo (Alt+F7) y subiendo. Estando en X, la combinación de teclas de Alt+Function se reemplaza con Ctrl+Alt+Function; si usted está en X y quiere volver a un inicio de sesión de texto (sin terminar su sesión de X), Ctrl+Alt+F3 lo llevara a la tercera consola. (Alt+F7 lo devolverá, asumiendo que está usando la primera sesión de X.)


    Resumen

    mando , y los terminales virtuales. Usted debe sentirse cómodo en trabajando en la línea de comandos, ejecutando programas, y usando las tuberías y operadores de redireccionamineto para combinar los comandos. Finalmente, usted debe tener una idea del poder del usuario root y de porque es una mala idea estar como root.


    Booteando Indice Estructura del Filesystem