Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

lunes, 29 de julio de 2013

Autocompletar comandos: Bash-Completion

Sabemos que cuando utilizamos la terminal podemos auto-completar el nombre de un archivo o comando utilizando la tecla [TAB].

Ejemplo:

usuario@host:~$ sudo apt-get [TAB]
autoclean        check            dselect-upgrade  source
autoremove       clean            install          update
build-dep        dist-upgrade     purge            upgrade
changelog        download         remove

Tal como en el ejemplo esto lo realizo con un usuario que se encuentra dentro del archivo /etc/sudoers capas de utilizar comando como si se tratase del root. Hablaremos de este archivo en estradas posteriores.

La situación cambia cuando nosotros nos cambiamos al usuario root ya sea con:

usuario@host:~$ sudo su # Utilizando contraseña del usuario que ejecuta el comando. En este caso usuario.
su # utilizando contraseña del usuario root.

Si tratamos de realizar lo anterior nos damos cuenta de que nos muestra algo similar a lo siguiente:

root@host:~# apt-get [TAB]
Display all N possibilities? (y or n)
#
# Lista de archivos del directorio actual.
#
--More--

Cuando en realidad queremos que nos auto-complete o muestra las opciones que tenemos disponibles.

Este comportamiento no esta disponible por defecto por lo que si queremos activarlo tenemos la necesidad de editar el archivo /root/.bashrc


root@host:~# nano .bashrc
Buscar lo siguiente:

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
#    . /etc/bash_completion
#fi
y descomentamos las últimas tres lineas que muestro, es decir, debe quedar así:
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Podemos reiniciar nuestra terminal o simplemente cargar nuestra configuración haciendo uso de source:

root@host:~# source .bashrc
¡Listo! ya nos podrá auto-completar los comando también con el usuario root.

Si queremos que este cambio se realice con todos los usuario deberemos debemos de editar el /etc/bash.bashrc y descomentar las mismas lineas o algunas similares.

NOTA:

Como se indica en los comentarios del archivo ~/.bashrc si ya se encuentra habilitado en /etc/bash.bashrc no es necesario realizarlo en este archivo.

Eso es todo por el momento si quieren más información revisar los siguiente sitios:
http://bash-completion.alioth.debian.org/
http://tldp.org/LDP/abs/html/tabexpansion.html
http://www.debian-administration.org/articles/316

sábado, 6 de julio de 2013

Generación de números aleatorios en bash shell y uso de for.

Esta ocasión les traigo dos formas de generar número aleatorios que me fueron de utilidad para un programa en c++ que realice.

La primera es haciendo uso de la variable $RANDOM

Su forma de trabajar es muy simple
$ echo $RANDOM
18636
Que en mi caso ese resultado obtuve.

Pero si lo que quieres es generar un número aleatorio de un rango en especial podemos modificarlo ligeramente de la siguiente manera:

$ echo $((RANDOM%32))
21

El cual lanza un número del intervalo [0,32) = [0,31] en caso de no querer iniciar con 0 podemos sumar 1 de la siguiente manera:

$ echo $((1+RANDOM%32))
30

El cual lanzará algún número del intervalo [1,31].

La forma es agradable y con un poco de imaginación se podría generar una lista de números pero si no te quieres quebrar la cabeza puedes hacer uso del comando shuf el cual si una lista de números aleatorios indicando un intervalo y cantidad.

Como ejemplo vamos a generar 23 números dentro del intervalo [0,44] el cual se haría de la siguiente manera:

$ shuf -n 23 -i 0-44
15
9
12
...
11
13
35

Ya que si la forma en que se te presento no fue de tu agrado podemos modificarlo para que aparezcan en una sola linea separados por un espacio:

$ echo $(shuf -n 23 -i 0-44)
41 28 33 34 38 6 26 27 42 4 31 43 40 25 21 2 8 5 19 10 37 3 13

Bueno como les comente al principio esto salio de la necesidad de obtener números aleatorios para probar un programa. De hecho loo que necesitaba era obtenerlos de la siguiente manera;

2 56 369 78 12
32 456 8789 7 2

Ya que el programa consistía en llenar una matriz para verificar que se tratase de un Rectángulo Latino (en otro post tal vez coloque el código por si a alguien le interesa y hablaré más al respecto) y debido a que tenia bastante flojera de teclearlos cada que probara el programa se me ocurrió que sería mejor generarlos con nuestra siempre amigable terminal :)

Así que agregando un ciclo for queda de la siguiente manera:
$ for i in `seq 1 20`
> do
>   echo $(shuf -n 23 -i 0-44 )
> done

Explico brevemente el comando seq es utilizado para generar números consecutivos de un rango en este caso del 1 al 20 los cuales se le asignan a la variable i (que no esta siendo utilizada para este ejemplo)  en cada iteración el valor que retorne el comando seq.

Para ver esto más claro pensemos en esto:
$ for i in `seq 1 2`
do
echo $i
done
1
2

El ciclo for separa por espacio todo lo obtenido en seq por lo cual sería equivalente a escribir:
$ for i in 1 2...

Cuando detecte el ciclo for que ya no hay más elementos se termina el ciclo.

Como ejemplo nuevamente generaremos una lista de números que estén dentro del intervalo [0,50]  con 10 filas y 15 columnas de la siguiente manera:

$ for i in `seq 1 10`; do   echo $(shuf -n15 -i 0-50 ); done
39 13 35 44 42 43 7 29 22 37 2 47 6 36 18
24 30 1 12 8 32 48 39 29 33 44 9 20 43 13
34 28 2 47 12 44 16 1 31 24 22 15 18 35 0
48 11 49 18 4 34 30 20 17 46 9 45 29 38 7
11 21 9 20 1 44 31 35 17 15 47 13 18 46 12
47 40 26 48 15 38 19 3 16 34 24 37 44 45 14
39 1 21 4 20 22 38 13 24 6 17 42 43 10 41
46 31 47 33 28 1 14 2 20 35 23 27 36 38 48
42 5 46 6 16 21 27 33 35 48 25 49 10 47 36
33 30 3 15 20 47 2 45 13 5 34 19 29 0 14

Espero les sirva.

Y luego hablaremos de algo llamado IFS y profundizaremos en el ciclo FOR.