Intérprete de Comandos Script

Kepa Bengoetxea

1

Referencia:
• • • • http://www.tldp.org/LDP/abs/html/ http://www.e-ghost.deusto.es/docs/shellScriptin.html man bash http://es.tldp.org/Manuales-LuCAS/blfs-es/blfs-es-5.0/postlfs/profile.html

1

Emulador de Terminal
• Emulador de terminal:Un emulador de terminal es un programa informático que simula el funcionamiento de un terminal de un ordenador central a través de una red de telecomunicaciones entre dicho ordenador central y el ordenador que ejecuta el emulador de terminal • Existen diferentes “emuladores de terminal”: – El emulador de terminal por excelencia es Telnet – En los ordenadores personales destacan PuTTY y ssh – Para el escritorio Gnome: gnome-terminal – Para sistema de ventanas X Window System: xterm
1

Emulador de Terminal
• Uso emulador de Terminal: – Acceder a un shell de UNIX – Se limitan a enviar y recibir caracteres de texto a través de una red de comunicaciones. Los caracteres enviados se corresponden con pulsaciones en el teclado y los caracteres recibidos corresponden con la pantalla visualizada. Lo único que los diferencia es el tipo de terminal físico emulado. Dos modelos básicos:VT-100 y 3270

1

Shell o Intérprete de Comandos
• Un shell es un programa que interpreta y ejecuta los comandos que el usuario escribe en un indicador de línea de comandos. Cuando inicie una terminal la aplicación activará el shell predeterminado especificado en la cuenta del sistema.

1

Shell o Intérprete de Comandos
• Tipos:
– Sh: Bourne shell – Csh:C shell. Ampliación sh con particularidades del lenguaje C. – Bash: GNU Bourne-Again shell. Linux (defecto). Parecido al sh. Sigue el standard IEEE POSIX(Portable Operating System Interface X de Unix, se traduce en, Sistema Operativo Portable basado en UNIX) – Tcsh:Es la versión csh para Linux. • Cada usuario tiene un shell por defecto, que se asocia a la hora de crear el usuario.
1

Shell o Intérprete de Comandos
• Un Interprete de Comandos “bash” es un aplicación de usuario, no es parte del kernel(Si hacemos bash->bash make xconfig no $dpkg-query -l aparece por ningún lado. )
3.2-0ubuntu7 rpm -qf /bin/bash ->bash-2.05b-38 $rpm -ql bash /bin/bash /bin/bash2 /bin/sh /etc/skel/.bash_logout /etc/skel/.bash_profile /etc/skel/.bashrc ... $ dpkg-query -L bash /bin/bash /etc/skel/.bashrc /etc/skel/.profile /etc/skel/.bash_logout

1

Shell o Intérprete de Comandos
• Intérpretes de comandos: Command.com, bash...

Su funcionamiento es: •Lee la entrada introducida por el usuario •Comprueba si el comando es 1.-un comando interno (Ejm:/bin/ls) 2.-un alias (alias dir='ls') 3.-un programa ejecutable(./principal.exe) buscando en los caminos de su “echo $PATH”, si no lo encuentra dará un error. •Si lo encuentra,lo ejecuta. Si no es un comando o un programa dará error.
1

Curiosidades:
• Historial de comandos: – history: muestra los comandos ejecutados por el usuario asociados a un número – !nº : ejecuta el comando de dicho número. – Tecla arriba: ejecuta el último comando ejecutado. • Uso del tabulador: ap [tab] rellena con apache

1

Curiosidades:
• Uso ?,*,[]: – grep 4 * – grep 4 ???eba – grep 4[1-3] prueba 41 42 43 – grep [Kk]epa prueba – grep 4[13] prueba 41 43
1

Creación de un Script Script->Es un fichero de comandos.
1. Editar:$vi ejemplo
#crea un directorio ’lana’ y muestra sus ficheros ocultos mkdir lana cd lana ls –a

2. $chmod u+rx ejemplo 3. #copy ejemplo /usr/local/bin/ 4. $ejemplo Nota: ./ejemplo si el script no está en los caminos del PATH (mirar con echo $PATH)
1

Entorno y Variables
#echo $SHELL ->/bin/bash #vi mensaje echo “Estás en un curso de A.S.O: $nombre” #nombre=”Linux” #./mensaje #? #echo $nombre #? #export nombre #./mensaje #? Abre una nueva terminal:gnome-terminal 1 #./mensaje

Entorno y Variables
./mensaje ->Llamada a una bash hijo, que ejecuta dicho script.
#vi mensaje sleep 15 # chmod 700 mensaje (Antes de ejecutar) # ps -lF
F S UID CMD 0 S kepa 0 R kepa PID PPID C PRI NI ADDR SZ WCHAN RSS PSR STIME TTY 3860 3858 0 76 0 - 1099 wait4 1244 0 18:14 pts/2 00:00:00 bash 4093 3860 0 77 0 - 563 748 0 22:23 pts/2 00:00:00 ps -lF
1

TIME

Entorno y Variables
(Después de ejecutar) #./mensaje &
[1] 4100

# ps -lF
F S UID CMD 0 S kepa 1 S kepa 0 S kepa 0 R kepa PID PPID C PRI NI ADDR SZ WCHAN RSS PSR STIME TTY 3860 4100 4101 4102 3858 3860 4100 3860 0 0 0 0 75 75 77 78 00001099 wait4 1248 0 18:14 pts/2 00:00:00 bash 1099 wait4 1252 0 22:26 pts/2 00:00:00 bash 933 480 0 22:26 pts/2 00:00:00 sleep 20 563 748 0 22:26 pts/2 00:00:00 ps -lF TIME

1

Entorno y Variables
• 3 zonas de memoria: – Área de datos locales al shell – Área de datos globales al shell – Área de datos globales a todos los shell

1

Entorno y Variables
• Área de datos locales: – Sólo es accesible en ese shell – Ningún subproceso(hijo) que se genere puede acceder a él – Uso: Mientras se ejecuta el proceso – Se crea con: nom-variable-local=X – Se borra con:unset nom-variable-local

1

Entorno y Variables
• Área de datos globales al shell: – Accesibles para tu bash y los hijos de ese bash. Si abres otro shell o terminal no vale! – Crear: export nombre=”Linux” ó nombre=”Linux” y export nombre – Borrar: export –n nombre

1

Entorno y Variables
• Área de datos globales a todos los shell: – Accesibles durante toda la sesión – Uso: Conocer las características de la sesión como: tipo de terminal, rutas de búsqueda, directorio de presentación, indicativo de sistema etc... – Editando /etc/profile; $HOME/.bashrc; $HOME/.bash_profile #vi .bash_profile PATH=$PATH:$HOME/bin export PATH
1

Entorno y Variables:Comandos
• set: Muestra la lista de variables locales definidas. • env:Muestra las variables globales o de entorno. Son utilizadas por el sistema pero están a disposición del usuario.
• HOME: Contiene cual es dir.trabajo • PATH: Contiene lista de directorios a buscar • CDPATH:Contiene una lista de directorios a los que podremos acceder sin añadir su path. • PPID:Contiene el identificador de proceso padre • PWD: el path del directorio donde estoy

1

Entorno y Variables Comandos:echo
• SHLVL: Indica el nivel de anidación de intérpretes de comandos invocados. • RANDOM: devuelve un número aleatorio. • SECONDS: muestra los segundos desde que se invocó.

• echo:Muestra el contenido(variable o texto)
• echo $HOME
– >/home/kepa

• echo –e "el contenido de mi carpeta:\n `ls -a` "
Nota:La opción -e permite incluir carac-s escape y comandos entre comillas graves dentro de texto con comillas dobles (` es la tecla de donde esta el [)

1

Entorno y Variables
• Las variables en el bash son sin tipo, son una lista de caracteres que permite operaciones aritméticas si todos los caracteres son dígitos. • Ejm:
a=1 a=`expr $a + 1` echo "$a" a="b" echo `expr $a + 1` $ ./pru 2 expr: argumento no numérico

1

Comandos:echo
• echo
– Caracteres escape:
– – – – – – – – \c evita el salto de línea \n inserta un salto de línea \f inserta un salto de página \t inserta un tabulador \v inserta un tabulador vertical \b código de retroceso \r retorno de carro \nnnn genera el código ASCII del número octal

1

Comandos:echo
Caracteres especiales (*,$,\,?,etc) son interpretados antes de pasarlos a echo, para controlar que tengan efecto o no se utilizan:
– Comillas simples(‘): Impide la interpretación » echo ‘$BEGO‘ ->$BEGO – Comillas graves(`): Lo interpreta como comando » echo –e " mi carpeta:\n `cd` “ ->/home/kepa – Comillas dobles("): Permite la intepretación de $,\, comillas simples, comillas dobles » echo "$HOME“ ->/home/kepa – \ Elimina el significado del sgte carácter » echo "\$HOME"->$HOME

1

Estructuras de Control:test
• test: permite realizar comparaciones entre valores y variables, así como una serie de chequeos sobre ficheros
– Comparar dos cadenas:

$test “hola” = “hola” echo $? 0 $test “hola” = “hola1” echo $? 1
1

Estructuras de Control:test
– Comparar dos variables: cadenas

nomvar1=”kaixo” nomvar=”kaixo” test $nomvar = $nomvar1 echo $? 0
– Comparar dos variables: números

num1=1 num2=1 test $num1 = $num2 echo $? 0

1

Estructuras de Control:test
– Tratamiento de cadenas:
• • • • • • • • • • • test $cad1 = $cad2 test $cad1 != $cad2 test -z $cad #verdadero si cad esta vacía test -n $cad #verdadero si cad no es nula test $cad #verdadero si cad no es nula test $num1 -eq $num2 test $num1 -ne $num2 test $num1 -lt $num2 test $num1 -le $num2 test $num1 -gt $num2 test $num1 -ge $num2
1

– Tratamiento de expresiones numéricas:

Estructuras de Control:test
• Tratamiento de Ficheros: Ejm: nomfich="prueba.txt" test -f $nomfich echo $? -> 0 – Retorna true(0) si... test -e $nomfich #si existe el fich test -f $nomfich #si es fich normal (no un dir o un dispositivo) test -s $nomfich #si su tamaño es distinto de 0 test -d $nomfich #si es directorio test -b $nomfich #si es un disp. de bloque (fd0,hda, ...)
1

Estructuras de Control:test
• Tratamiento de Ficheros: test -c $nomfich #si es un disp. de carácter (keyboard, modem, sound card, etc.) test -p $nomfich #si es una tubería test -h/-L $nomfich #si es un enlace simbólico test -S $nomfich #si es un socket test -r $nomfich #si tienes permiso de lectura test -w $nomfich # si tienes permiso de escritura test -x $nomfich # si tienes permiso de ejecución test -O $nomfich # si eres el propietario
1

Estructuras de Control:test
• Opciones Fichero: Retorna true si... test -G $nomfich #si pertenece al grupo del fichero test -N $nomfich #si ha sido modificado desde la última vez que lo leíste test $nomfich1 -nt $nomfich2 #Si $nomfich1 es más reciente que $nomfich2 test $nomfich1 -ot $nomfich2 #Si $nomfich1 es posterior a $nomfich2 test $nomfich1 -ef $nomfich2 #Si $nomfich1 y $nomfich2 son enlaces duros del mismo fichero

1

Estructuras de Control:test
• Opciones:
– ! expr devuelve valor booleano contrario a la expr – expr1 -a expr2 es un AND – expr1 -o expr2 es un OR Ejm: y=1 x=1 if test $x -eq 1 -a $y -eq 1 then echo "iguales" fi
1

Estructuras de Control:test
– Ejemplo:

if test -e $1 then echo "El fichero $1 existe" else echo "El fichero $1 no existe" fi

1

Comandos:read
• read: Permite la introducción de valores a través de un guión.
echo "introduce un directorio" read dir if test -d $dir then echo "El contenido del directorio es $dir" echo "`ls $dir`" fi
1

Comandos:expr
• Trabajar con números: expr

echo `expr 2 + 200` -> 202 expr 4 \* 2 expr 4 ###BOT_TEXT###gt; 2 expr 4 % 2 expr 4 ###BOT_TEXT###gt;= 2 expr 4 / 2 Nota: \ para evitar mezclar con los caracteres especiales: *(cualquier carc),>,< (redireccionamiento)....

1

Comandos:expr
• Ejm1:

$vi pru echo "Introduce dos números:" read n1 n2 echo "La suma es `expr $n1 + $n2` " $ chmod u+x pru $ ./pru Introduce dos números: 25 La suma es 7
1

Comandos:expr
• Ejm2:

$vi pru echo "Introduce dos números:" read n1 n2 echo "La multiplicación es `expr $n1 \* $n2` " $ chmod u+x pru $ ./pru Introduce dos números: 25 La multiplicación es 10
1

Estructura de Control: números y [ ]
• Otra manera de trabajar con números: [ ] if [ $valor1 -eq(=) $valor2 ] then echo $valor1 fi
Dejar un espacio

1

Estructura de Control: Cadenas: test,[[]],(())
• test :Ejm: if test $1 = "LINUX" then echo "$1=LINUX" fi if test $1 = $2 then echo "$1=$2" fi #no utilizar -eq con caracteres!

1

Cadenas:test,[[]],(())
• [[ ]] :Ejm: if [[ $1 == "LINUX" ]] then echo "$1=LINUX" fi if [[ $1 == $2 ]] then echo "$1=$2" fi #no utilizar -eq con caracteres! if [[ $1 -eq $2 ]] then echo "$1=$2" fi
1

Uso:test,[[]],(())
if (( $1-eq $2 )) then echo "$1=$2" fi if (($1==$2)) then echo "$1=$2" fi

1

Entorno y Variables:Parámetros
• Parámetros: $0,$1,$2,$3...$9
– $0 contiene el nombre del script – $1 el primer parámetro que se le pasa al script. – $# indica el nº de parámetros con el que se ha llamado al script. – $* lista de todos los parámetros. – $? código de error generado por la última orden. (0 true y <>0 false)

1

Entorno y Variables:Parámetros
• shift: Si necesitamos más de 9 parámetros, se desplaza hacia la izquierda en una posición, así $1 toma el valor de $2 • Otra manera de obtener los argumentos después del $9, es utilizando llaves, por ejm: ${10}, ${11}, ${12}
Ejm: $vi pru echo "${11}" ./pru 1 2 3 4 5 6 7 8 9 10 11 11
1

Entorno y Variables: Parámetros
echo "El nombre del programa es $0" echo "El valor del primer parámetro es $1" echo "El valor del segundo parámetro es $2" echo "El numero de parámetros introducido es $#" echo "La lista de todos los parámetros es $*" shift echo "El valor del segundo parámetro después de un shift queda en $1" echo "El valor que retorno es $?"

./pru 1 2 3 4 5 6 7 8 9 10 11
1

Estructuras de Control: Secuencia
• Secuencial comandos:
$ ls dir1 ; ls dir2 ; ls dir3 > fich.txt

• Grupo de comandos:
$ (ls lana;ls dos) > fitx.txt

1

Trucos
• Expansión de llaves:
$ echo {one,two,red,blue}fish onefish twofish redfish bluefish • Sustitución de Comandos: $(command) donde command tiene salida estándar. Se usa para asignar el valor a una variable o para pasar como parámetro a otro comando.
$ date +%d-%b-%Y 24-sep-2007 $ today=$(date +%d-%b-%Y) $ echo $today 24-sep-2007 $ rpm -ql $(rpm -qa | grep httpd)
1

Estructuras de Control:For
• For: ejecuta tantas veces como elementos en lista
for contador in 1 2 3 do echo "El bucle durante $contador veces" done Nota: Va cogiendo los diferentes valores de la lista hasta que finaliza cuando contador es null.

1

Estructuras de Control:For
• For: ejecuta tantas veces como elementos en lista cadena=$(seq 1 3) for a in $cadena do echo hola done seq 9 -1 1 seq 1 9

1

Estructuras de Control: Select
• select: Similar al for. Una vez ejecutado el grupo de comandos volverá a mostrarnos la lista de opciones sucesivamente hasta que pulsemos (Ctrl+C ó Ctrl+D)
select user in alum301 alum302 alumn303 do echo "Enviando mensaje a $user" mail $user <msg done

1

Estructuras de Control:Select
• select:
$ ./pru 1) alum301 2) alum302 3) alumn303 #? 2 (Introducido por teclado) Enviando mensaje a alum302

1

Estructuras de Control:Select
• select:
#? 3 (Introducido por teclado) Enviando mensaje a alumn303 #? /home/kepa/dead.letter... Saved message in /home/kepa/dead.letter #? Ctrl+D (Introducido por teclado)

1

Estructuras de Control:Case
• case: vi menu
echo "1: Mostrar fecha y hora" echo "2: listar directorio" echo "Introduzca su opcion" read opcion case $opcion in 1)date;; 2)ls $HOME;; *)echo "Entrada no valida. adios";; esac
1

Estructuras de Control:Case
• case: Elige una opción entre $ ./pru 1: Mostrar fecha y hora 2: listar directorio Introduzca su opcion 2 Admin Contrapatentes.txt gcc.sxi

1

Estructuras de Control:If
• if: $ ./pru lana if mkdir $1 then
echo "Creando directorio $1" echo "Copiando ficheros" cp ~/.* $1

else
echo "Error al crear el directorio $1"

fi
1

Estructuras de Control:If-elif
if test condition1 then command elif test condition2 # Same as elseif then command else default-command fi

1

Estructuras de Control:while|until
• While|until:
– while verdadero do ---- done – until falso do ----- done
while test $n -le 9 do echo "Introduzca un valor" read valor acum=`expr $acum + $valor` n=`expr $n + 1` done echo "Acumulado=$acum"

1

Estructuras de Control:function
• Function:
$vi prueba

function buenosdias() { echo “egunon $1” } buenosdias $1
$./prueba Kepa egunon Kepa
1

Estructuras de Control:Exit
• exit: se usa para terminar un script o una función de un script. El valor que se devuelve lo recogerá el proceso padre. • Todos los comandos retornan un exit donde 0 significa éxito y <> 0 un código de error. En caso de que nuestro script no tenga exit devolverá el estado del último comando ejecutado.
1

Estructuras de Control:Exit
#!/bin/bash echo hello echo $? # Echo devuelve un 0 ya que el comando se ha ejecutado con éxito lskdf # No reconoce el comando echo $? # Devuelve <> 0 ya que el comando ha fallado exit 113 # Retornará 113 al shell # Para verificar escribe "echo $?" después de ejecutar el script.
1

Modos de ejecución de Script
Script->Es un fichero de comandos. Ejm: vi ejemplo
mkdir lana cd lana ls –a

1.-$bash ejemplo 2.-$ejemplo 3.-$source ejemplo 4.-$. ejemplo 5.-$exec ejemplo
1

Modos de ejecución de Script
Ejm1: more ejemplo1
#! /bin/bash #crea un directorio ’lana’ y muestra sus ficheros ocultos mkdir lana cd lana ls –a (*) Comprobar si se modifica el directorio actual en los 5 diferentes modos.

1

Modos de ejecución de Script
$ exec ejemplo1 Se ejecuta en el mismo proceso que le llama. Normalmente cuando se llama a un script se crea un subproceso hijo con fork para que lo ejecute. Aquí el comando reemplaza al shell y cuando el script termina se cierra el shell, utilizándose en el último comando del script.
1

Modos de ejecución de Script
Ejm:vi prueba ls $ exec ./prueba

1

Intérpretes: 2 Tipos
• Intérprete interactivo de conexión • Intérprete interactivo de no conexión

1

Intérpretes: 2 Tipos

1

Intérpretes: Conexión
• Se ejecuta cuando abrimos una sesión con telnet o ssh o programa mingetty...
– – – El programa mingetty muestra un mensaje de login (usuario: kepa passwd:******) Después de introducir, se carga el /bin/login que lee /etc/passwd o /etc/shadow Si el usuario registrado está en dichos ficheros se inicia una sesión interactiva con bash (se llama a /bin/bash), ésta ejecutará el script /etc/profile(todos los usuarios) y después uno de los siguientes scripts: ~/.bash_profile, ~/.bash_login o ~/.profile; y /etc/bashrc(si existe) y ~/.bashrc
1

Intérpretes: No Conexión
• Se ejecuta cuando ejecutamos directamente el comando /bin/bash
– ejecuta /etc/bashrc(si existe) – ejecuta ~/.bashrc

1

Scripts: Inicio de Sesión./etc/profile
USER=`id -un` LOGNAME=$USER MAIL="/var/spool/mail/$USER" HOSTNAME=`/bin/hostname` HISTSIZE=1000 if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then INPUTRC=/etc/inputrc fi export USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
1

(fedora)

Scripts: Inicio de Sesión./etc/profile
(Ubuntu)
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) and Bourne compatible shells (bash(1), ...) umask 022
if [ "$PS1" ]; then if [ "$BASH" ]; then PS1='\u@\h:\w\$ ' if [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi else if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' 1 fi

Scripts:Inicio de Sesión. #archivo donde se almacena los comandos ejecutados Variables de HISTFILE=~/.bash_history ambiente
# Tamaño del fichero HISTSIZE=1000 # documentación en castellano del man MANPATH=/usr/share/man/es LANGUAGE=es LANG=es_ES export LANG LANGUAGE MANPATH HISTFILE ...

1

Scripts:Inicio de Sesión. Variables de ambiente
#cambiar el tipo de terminal: #si nos conectamos desde linux o windows TERM=vt100 o ansi #Consultar los tipos de terminal ir a : /usr/share/terminfo #Cambiar y consultar la base terminfo desde el bash con el programa: tput bold #terminal muestra con negrita

1

Scripts:Inicio de Sesión. Variables de ambiente
PS1 Y PS2 • Contienen los prompts que bash presenta al usuario. • PS1: es el prompt principal (cuando espera comandos) Ejm:[kepa@vppy118 share]$ echo $PS1 [\u@\h \W]\$ Puedo añadir PS1="[\u@\h \w \W]\$" [root@vppy118 ~ root]$export PS1 Para más información: man bash
1

Scripts:Inicio de Sesión. PS1 Y PS2 Variables de ambiente
• PS2: es el prompt secundario (cuando espera a que se complete la información de un comando)
[kepa@vppy118 kepa]$echo $PS2 > [kepa@vppy118 kepa]$for a in $(seq 1 3) > do > echo hola > done hola hola hola
1

Scripts:Inicio de Sesión.
• En función del shell que se ejecute por defecto el fichero será diferente:
Shell Fichero sh .profile bash .bash_profile .profile Csh;tcsh .login

1

Scripts:Inicio de Sesión.
Fedora:.bash_profile
if [-f ~/.bashrc]; then . ~/.bashrc fi PATH=$PATH:$HOME/bin export PATH unset USERNAME

Ubuntu:.profile
if [ -n "$BASH_VERSION" ]; then if [ -f ~/.bashrc ]; then . ~/.bashrc fi fi if [ -d ~/bin ] ; then PATH=~/bin:"${PATH}" fi
1

Scripts:Personalización de entorno
.bashrc • Se ejecuta cuando abrimos un intérprete de comandos , exceptuando cuando entramos en el inicio de sesión (que lo ejecuta el .bash_profile) • Se utiliza para
– – Establecer el entorno para el prompt Establecer el entorno para los scripts que ejecutemos.

1

Scripts: Personalización de entorno
• En función del shell que se ejecute por defecto el fichero será diferente:
Shell sh Fichero (no tiene) bash .bashrc Csh;tcsh .cshrc

1

Scripts: Personalización de entorno Ubuntu:.bashrc Fedora:.bashrc
if [-f etc/.bashrc]; then . etc/.bashrc fi alias del=‘rm’ alias moer='more'
export HISTCONTROL=ignoredups export HISTCONTROL=ignoreboth if [ "$TERM" != "dumb" ]; then eval "`dircolors -b`" alias ls='ls --color=auto' fi ... if [ -f /etc/bash_completion ]; then . /etc/bash_completion
1

Scripts: fin de sesión
• En función del shell que se ejecute por defecto el fichero será diferente:
Shell sh Fichero .logout bash Csh;tcsh .bash_logout .logout

1

Scripts:fin de sesión
.bash_logout • Se ejecuta cuando salimos de la sesión • Se utiliza para
– Dar mensajes de despedida – Limpiar la pantalla

1

Scripts:fin de sesión
.bash_logout(fedora)
clear

.bash_logout(Ubuntu)
# when leaving the console clear the screen to increase privacy if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi
1

Scripts: fin de sesión
• Ejm:.bash_logout clear date echo *********************** echo Laster arte Kepa echo ***********************

1