Guía de comandos básicos - Parte III

Manipulando el shell

Que es un shell: Un shell es un interpretador de comandos o un macro procesador lo que permite expandir textos y símbolos para crear expresiones mas largas.

Un shell permite ser ejecutado de forma interactiva cuando acepta comandos directamente desde el teclado, no interactivos cuando aceptas comandos que provienen de un archivo.

Existen varios tipos de shells en sistemas de código abierto, entre ellos: Bash (Bourne-again shell), Ksh (Korn-Shell), csh (C shell), tsh (TC shell), sh (Bourne Shell). Acá nos enfocamos a Bash que es el mas popular.

Configurando una variable

Var=valor, export Var
Ejemplo:

dario@Leona:~/ejemplos$ HOLA="HOLA MUNDO"
dario@Leona:~/ejemplos$ export HOLA
dario@Leona:~/ejemplos$ echo $HOLA
HOLA MUNDO
dario@Leona:~/ejemplos$

Cual es el shell que estamos usando

Para determinar el shell que estamos usando sobre el terminal, ejecutamos el comando ps (process status en inglés).

Ejemplo:

dario@Leon:~/ejemplos$ ps
PID TTY TIME CMD
10033 pts/6 00:00:00 ps
30254 pts/6 00:00:01 bash
dario@Leon:~/ejemplos$ echo $SHELL
/bin/bash
dario@Leon:~/ejemplos$

Para mostrar el valor de una variable usamos el comando echo, vale la pena destacar que para crear una variable usamos var=valor, para ver dicha variable usamos el signo de dolar ($) seguido del nombre que le hemos otorgado a la variable.

Desconfigurando una variable

Para hacer que la variable deje de tener el valor que hemos asignado usamos el comando unset (desconfigurar), el formato del comado:

unset Var
Ejemplo:

dario@Leon:~/ejemplos$ echo $SHELL
/bin/bash
dario@Leon:~/ejemplos$ unset SHELL
dario@Leon:~/ejemplos$ echo $SHELL

dario@Leon:~/ejemplos$

Para desplegar el nombre de las variables y sus valores, así como las funciones uno de los comandos que podemos usar es es comando set.
Algunas variables que estan predefinidas en los shell:

Variable Valor
HOME Coloca el valor producto del uso del comando cd siempre Que sea sin argumentos
LOGNAME Usuario con el que se esta trabajando
SHELL Indica el shell que se esta usando
PATH Rutas donde encontrar los comandos mas comunes a ser Ejecutados por necesidad del shell
PS1 Especifica el prompt principal
PS2 Prompt secundario

 

Personalizando el uso de los shells

Pormpt

El PS1 (prompt string 1 en íngles) algo así como cadena de caracteres en español.


Para definir el PS1 prompt usamos la definición de una variable como se definió en la sección anterior.

Ejemplo:
dario@Leona:~$
dario@Leona:~$PS1="Este es el prompt$ "
Este es el prompt$

El manejo del prompt (PS1) permite añadir caracteres de escape especial, estos son:
\a carácter de campana ASCII (07)
\d la fecha en formato día mes día (p.ej., "mié jul 02")
\D{format}
el formato es proporcionado a strftime(3) y el resultado es insertado en la cadena dle indicador; un formato vacío
resulta en una representación de fecha especifica local. Las llaves son requeridas.
\e caracter de escape ASCII (033)
\h el nombre del host hasta el primer `.'
\H el nombre del la máquina completo (FQDN)
\j el número de trabajos actualmente gestionados por el interprete
\l el nombre base del dispositivo de terminal del interprete
\n carácter de nueva línea
\r retorno de carro
\s el nombre del interprete, el nombre base de $0 (el fragmento que sigue a la última diagonal)
\t la hora actual en formato 24-horas HH:MM:SS
\T la hora actual en formato 12-horas HH:MM:SS
\@ la hora actual en formato 12-horas AM/PM
\A la hora actual en formato 24-houras HH:MM
\u el nombre del usuario actual
\v la versión del pquete bash (p.ej., 2.00)
\V la versión del paquete bash + el nivel de parche (p.ej., 2.00.0)
\w el directorio actual de trabajo, con el directorio $HOME abreviado con una tilde
\W el nombre base del directorio actual de trabajo, con el directorio $HOME abreviado con una tilde
\! el número del comando actual en el histórico
\# el número de comando del comando actual
\$ si el UID efectivo es 0, un #; en otro caso, $
\nnn el caracter correspondiente al número en octal nnn
\\ una diagonal invertida
\[ inicio de una secuencia de caracteres no imprimibles que pueden usarse para ingresar una secuencia de control
en el indicador de la terminal
\] fin de una secuencia de carácteres no imprimibles


Ejemplo:
dario@Leona:~$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$”
dario@Leona:~$

NOTA: Recuerda usar siempre las dobles comillas para definir el PS1

PATH

Define las rutas donde podemos encontrar ejecutables y comandos definidos por el usuario, esto hace mas facil la vida al usuario ya que ahorra tipear la ruta completa.

Ejemplo:
dario@Leon:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
dario@Leon:/$ /bin/ls
bin cdrom etc …...
dario@Leon:/$

Como podemos apreciar en la el ejemplo anterior si no tuviéramos definido la ruta /bin, tendríamos que ejecutar el comando ls con su ruta completa, para incluir nuevas rutas lo podemos hacer como sigue a continuación:

dario@Leon:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
dario@Leon:/$ PATH=$PATH:/etc
dario@Leon:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/etc
dario@Leon:/$

Nota: En caso de desconocer la ruta para ejecución de algún comando podemos usar el comando which.

Ejemplo:
dario@Leon:/$ which find
/usr/bin/find
dario@Leon:/$

history

Muestra los comandos ejecutados sobre el shell.

Metodos de completación en bash

Para completar una ruta se usa la tecla tabulador, para buscar dentro del historial de comandos se usa la teclas de cursor.

Comandos de redirección

En los sistemas operativos se puede redireccionar la entrada o la salida de comandos usando los metacaracteres (<) o (>) o el comando (|). Sobre los sistemas operativos de código abierto la entrada por defecto es el teclado, la salida por defecto y los errores son redireccionados al monitor.

Cada comando en el sistema operativo tiene por defecto un file descriptor, algunos files descriptors:
Abreviación del file descriptor Valor Metacaracter asociado
stdin (Entrada) 0 0<
stdout (Salida) 1 1>
stderror (Error) 2 2>

Redireccionando la salida a un directorio
Ejemplo:

dario@Leona:~$ ls > /tmp/prueba
dario@Leona:~$ more /tmp/prueba
Desktop
dewd
Documents
downloads
Music
Redireccionando los errores por defecto a un archivo

Ejemplo:

dario@Leona:~/ejemplos/directorio2$ ls; ls /temp 2>salida
archivo archivo1 salida subdir1
dario@Leona:~/ejemplos/directorio2$ more salida
ls: cannot access /temp: No such file or directory
dario@Leona:~/ejemplos/directorio2$

Nota: En el ejemplo se puede ver que la salida del error es redireccionada por defecto al archivo de nombre salida por el uso del caracter de redirección.

Redirección (pipe)


El caracter especial pipe “|” (tubería en español) se usa para redirigir la salida de un comando a la entrada de otro comando.



Ejemplo:

dario@Leon:/$ ls -l | more
acpi
adduser.conf
adjtime
aliases
aliases.db
alsa
alternatives
--More--

Como podemos observar en el ejemplo, en este caso especifico la salida del comando ls es muy extensa por tal motivo es necesario mostrarlo en pasos de pantalla sucesivas para conseguir esto redireccionamos su salida al comando more que permitirá que la salida sea manejada pantalla por pantalla.

Archivos de inicialización

Los archivos de inicialización en los sistemas operativos de código abierto permiten cargar información para el usuario tal como atajos de comandos, funciones, información como el PATH, el EDITOR por defecto, etc. A continuación los principales par el bash.

Shell Archivo de inicialización para todos los usuarios Archivo de inicialización primario para el usuario al iniciar sesión Archivo de inicialización cuando un shell es comenzado Ruta del shell
Bash /etc/profile $HOME/.profile $HOME/.bashrc /bin/bash

Sobre los archivos de inicialización primaria se acostumbra a colocar información tal como el PATH, el EDITOR y en algunos casos el archivo de inicialización cuando el shell ya ha comenzado.

Sobre los archivos de inicialización cuando el shell ya ha comenzado se define informaación como funciones, alias, PS1, etc.

Definición de alias

Un alias sobre el sistema operativo nos ayuda a definir atajos para la definición de comandos haciendo mas facil para el usuario final recordar el alias.

Ejemplo:
dario@Leona:~/ejemplos/directorio2$ alias dir='ls -l'
dario@Leona:~/ejemplos/directorio2$ dir
total 8
-rw------- 1 dario dario 0 2010-02-11 17:45 archivo
-rw------- 1 dario dario 0 2010-03-27 16:04 archivo1
-rw-r--r-- 1 dario dario 51 2010-03-30 19:45 salida
drwx------ 3 dario dario 4096 2010-02-11 17:45 subdir1
dario@Leon:/$ alias cls=clear

Cambiando permisos a archivos y directorios

Para hacer el cambio a permisos y directorios sobre los sistemas operativos de código abierto se usa el comando chmod (change mode), este puede ser usado en modo octal o en modo simbólico:
Modo octal:
Modo octal Permiso
4 Lectura
2 Escritura
1 Ejecución

Modo simbólico

Quien Opción Permisos
Usuario=u + ó -ó = Lectura=r, Escritura=w, Ejecución=x
Grupo=g + ó -ó = Lectura=r, Escritura=w, Ejecución=x
Otros usuarios=o + ó -ó = Lectura=r, Escritura=w, Ejecución=x
todos=a + ó -ó = Lectura=r, Escritura=w, Ejecución=x

Modo octal

Para su ejecución se usan números que sumen el tamaño de los distintos caracteres para terminología sobre un archivo o directorio, esos caracteres son rwx, los valores son listados en la sección anterior

Ejemplos:

Sobre archivos
dario@Leon:~/ejemplos$ ls -l archivo
-rw-r--r-- 1 dario dario 11 2009-11-03 20:34 archivo
dario@Leon:~/ejemplos$ chmod 755 archivo
dario@Leon:~/ejemplos$ ls -l archivo
-rwxr-xr-x 1 dario dario 11 2009-11-03 20:34 archivo
dario@Leon:~/ejemplos$

Sobre directorios
dario@Leon:~/ejemplos$ ls -ld directorio1
drwxr-xr-x 2 dario dario 4096 2009-10-30 15:51 directorio1
dario@Leon:~/ejemplos$ chmod -R 444 directorio1
dario@Leon:~/ejemplos$ ls -ld directorio1
dr--r--r-- 2 dario dario 4096 2009-10-30 15:51 directorio1
dario@Leon:~/ejemplos$

La opción -R permite que sea aplicado de forma re cursiva

Modo simbólico

Para la ejecución de este modo es necesario tener claro a que corresponde cada caracter especial.
Ejemplo:
Sobre archivos:
dario@Leon:~/ejemplos$ ls -l archivo2
-rw-r--r-- 1 dario dario 0 2009-11-03 21:40 archivo2
dario@Leon:~/ejemplos$ chmod u+rw,g+r,o+rw archivo2
dario@Leon:~/ejemplos$ ls -l archivo2
-rw-r--rw- 1 dario dario 0 2009-11-03 21:40 archivo2
dario@Leon:~/ejemplos$

Sobre directorios:
dario@Leon:~/ejemplos$ ls -ld directorio2/
drwxr-xr-x 2 dario dario 4096 2009-10-30 15:46 directorio2/
dario@Leon:~/ejemplos$ chmod -R u+rw,g+r,o+rw directorio2
dario@Leon:~/ejemplos$ ls -ld directorio2/
drwxr-xrwx 2 dario dario 4096 2009-10-30 15:46 directorio2/
dario@Leon:~/ejemplos$

Modificando permiso por defecto sobre archivos y directorios

Cada archivo o directorio se crea con una permisología básica, este valor de permisología básica es afectado por un comando de nombre umask

Ejemplo:
dario@Leon:~/ejemplos$ umask
0022
dario@Leon:~/ejemplos$ umask 077
dario@Leon:~/ejemplos$ umask
0077
dario@Leon:~/ejemplos$ touch archivo_umask1
dario@Leon:~/ejemplos$ ls -l archivo_umask1
-rw------- 1 dario dario 0 2009-11-03 21:47 archivo_umask1
dario@Leon:~/ejemplos$ mkdir dir_umask1
dario@Leon:~/ejemplos$ ls -ld dir_umask1
drwx------ 2 dario dario 4096 2009-11-03 21:47 dir_umask1
dario@Leon:~/ejemplos$