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

martes, 11 de mayo de 2010

Crear y Entrar Directorios en un Solo Paso

Crear directorios desde el terminal y luego cambiar a estos puedes ser una tarea un poco pesada, en especial cuando el nombre del directorio contiene espacios. Pero con un simple truco se puede hacer este proceso más simple.

En vez de crear el directorio con un comando y luego usar otro comando para entrar a este, lo que sugieren es hacer un alias que automatice el proceso con un solo comando. Pero para hacer aun mejor este truco se puede hacer para que acepte espacios en blanco en el nombre del directorio. Para crearlo debes añadir el siguiente código al archivo ~/bashrc:

# mkdir, cd en el
mkcd () {
mkdir -p "$*"
cd "$*"
}

Una vez que has hecho esto, debes reiniciar el terminal, ahora puedes crear directorios y entrar en ellos con un solo paso e inclusive crear jerarquicamente:

mkcd Nuevo directorio/Nuevo sub-directorio

El truco que hace que el comando funcione es el segmento $* de la función, la cual expande todos los argumentos y los pone entre comillas. Puedes usar la misma técnica en cualquier función bash para pasar todos los argumentos.

Leído en One Thing Well.

viernes, 23 de abril de 2010

Manejando el Mensaje Bash "Comando no encontrado"

Algunas de las versiones mas recientes de las distribuciones más populares, como por ejemplo openSUSE 11.2, estan usando un bash un poco mas inteligente. Esta nueva versión de bash muestra mensajes de error más útiles cuando uno escribe un comando que no esta en el PATH pero si en un directorio "sbin".

Por ejemplo, si tipeas el comando ifconfig sin permisos de root te mostrara el siguiente mensaje:

$ ifconfig
Absolute path to 'ifconfig' is '/sbin/ifconfig',
so running it may require superuser privileges (eg. root).

Este mensaje esta diciendo que la ruta de ifconfig es '/sbin/ifconfig', y que por lo tanto necesitas permisos de administrador para ejecutarlo.

Lo cual de hecho es más util que el mensaje "Comando no encontrado" (Command not found).

Esto es una nueva función que se llama command_not_found_handle. Si se hace un grep en /etc se puede ver que es lo que sucede. La función se encuentra en /etc/bash_command_not_found y también viene incluida en la sesión bash vía /etc/bash.bashrc.

La función en si misma no es muy compleja, pero hay un par de cosas que seria interesante observar. El siguiente código determina si el shell invocado fue ejecutado desde el Midnight Commander o esta tomando entrada desde un pipe:

# do not run when inside Midnight Commander or within a Pipe
if test -n "$MC_SID" -o ! -t 1 ; then
echo $"$1: command not found"
return 127
fi

Y lo siguiente determina si el shell es invocado esta en un sub-shell:

# do not run when within a subshell
read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
if test $$ -eq $tpgid ; then
echo "$1: command not found"
return 127
fi

Al final de la función hay una sentencia que usa /usr/bin/command-not-found (escrito en Python) para buscar comandos en paquetes instalables (via zypper) pero para eso necesitas configurar una variable de entorno (COMMAND_NOT_FOUND_AUTO) para activarla, y por supuesto tener Python instalado. Para probarlo has lo siguiente:

$ export COMMAND_NOT_FOUND_AUTO=1
$ pascal
pascal: command not found
$ gcj
The program 'gcj' can be found in the following package:
* gcc-java [ path: /usr/bin/gcj, repository: zypp (repo-oss) ]

Try installing with:
sudo zypper install gcc-java

Debido a que la funcionalidad command-not-found es manejada por una función bash, puedes reemplazar la función instalada en el sistema con una que tu hayas creado o modificado. Todo lo que necesitas hacer es incluirla en el archivo .bashrc.

Leído en LinuxJournal.

miércoles, 14 de abril de 2010

Creación y Uso de Alias en Linux

Un alias es una cadena que sustituye un texto por otro, cuando es usada como la primera palabra de un comando simple.

En este articulo se vera como configurar o desconfigurar alias permanente o temporal. También se vera algunos ejemplos útiles sobre alias en bash los cuales podrías usarlos al inicio de tus programas bash.

Si deseas puedes revisar los artículos anteriores sobre Ejemplos de Código Bash y El Estado de Salida de un Comando Bash.

Como Configurar un Alias

Un alias puede ser definido en la linea de comandos, en .bash_profile o en .bashrc usando la siguiente sintaxis:


$ alias nombre='aquí escribes el comando completo y con opciones'

nombre - Es el nombre que deseas ponerle al alias

Esto quiere decir que "nombre" es un alias para dicho comando. Cada vez que "nombre" es escrito como un comando, bash reemplazará el comando correspondiente junto con las opciones especificadas en su lugar.

Nota: No hay espacios en blanco entre el signo igual (=). Las comillas son necesarias si la cadena que se usara tiene mas de una palabra.

Ejecutando este comando en la linea de comandos se creara un alias temporal. Eso quiere decir que el alias existirá hasta que salgas del terminal. Si guardas el alias en el archivo de inicio del bash (~/.bashrc) entonces el alias sera permanente.

Los siguientes alias podrían ser útiles. Puedes configurarlos en el archivo ~/.bashrc.

Ejemplos mas Comunes de Alias

Abrir el ultimo archivo modificado en Vim:


alias Vim="vim `ls -t | head -1`"

Buscar los 5 archivos mas grandes:


alias findbig="find . -type f -exec ls -s {} \; | sort -n -r | head -5"

Ubicar los procesos bash:


alias psg="ps -aux ¦ grep bash"

Listar incluyendo archivos ocultos con indicadores y colores:


alias ls='ls -aF --color=always'

Lista en formato largo:


alias ll='ls -l'

Limpiar todo el historial y la pantalla:


alias hcl='history -c; clear'

Limpiar la pantalla y lista:


alias cls='clear;ls'

Uso de espacio en el sistema de archivos:


alias dus='df -h'

Navegar a diferentes directorios:


alias ..='cd ..'
alias ...='cd ../..'

Ejemplos de Alias que Modificarían tu Entorno

Remover el bloqueo de firefox:


alias rm_fire_lock='/bin/rm .mozilla/firefox/NAME.default/.parentlock' # edit NAME

Logearse a una maquina remota a traves de SSH:


alias server_name='ssh 192.168.1.1 -l tom' # cambia el IP y el nombre de usuario
alias ser2='ssh www.dbserver.com -l kgf' # crea cuantas alias necesites

Logearse a un servidor csv:


export CVS_RSH=/usr/local/bin/ssh
alias cvl='cvs -d :ext:usuario@cvs.servidor.com:/usr/local/cvsroot'

Desmontar un cdrom


alias umnt='umount /mnt/cdrom'

Como Ver todos los Alias

Ejecuta el comando alias sin ningún argumento para ver la lista de los alias en un shell:


$ alias
alias ..='cd ..'
alias ...='cd ../..'
alias mnt='mount /mnt/cdrom'
alias umnt='umount /mnt/cdrom'
alias dus='df -h'

Para ver un alias en particular ingresa el comando con el formato "alias nombre" así como se muestra abajo:


$ alias dus
alias dus='df -h'

Detener Temporalmente el Uso de Alias

Cuando quieres llamar al comando en vez de a un alias, debes usar (/):


$ \nombredelalias

Por ejemplo, si has creado un alias que se llame cp y ahora deseas usar el comando cp en vez del alias, deberías hacer lo siguiente:


\cp * /backup/archivos/

Como Remover un Alias

Para esto usas el comando unalias, por ejemplo:


$ unalias hcl

$ hcl
-bash: hcl: comando no encontrado

Como Remover todos los Alias


$ unalias -a
$ alias

Nota: Las funciones shell son más rápidas por que un alias primero tienes que buscar el comando y luego resolverlo. Mientras que un alias es mas fácil de entender, los comandos shell son mas usados para casi todo propósito. Debes de tener cuidado al reemplazar un comando regular con un alias.

viernes, 26 de marzo de 2010

Estado de Salida de un Comando Bash

En este articulo se hablara sobre los comandos shell y sus internos en bash. Un comando es una secuencia de palabras. La primera palabra indica el comando que sera ejecutado y las siguientes palabras son argumentos, un argumento puede ser las opciones o parámetros del programa.

Algunos de los comandos Unix que ejecutas en la linea de comandos son comandos shell. Por ejemplo ls, lpr y grep.

$ ls -alF

$ lpr archivo

$ grep "cadena" archivo

Comando Shell Exit

El valor de retorno de un comando es el estado exit o 128 + N si el comando es terminado por la señal N. El estado exit es usado para revisar el resultado (OK/falla) de la ejecución del comando. Si el estado de salida es 0 entonces el comando se ejecuto con exito. Si el comando falla el estado de salida no sera 0.


Valor ExitEstado Salida
0 (Cero)Exito
No 0Fallo
2Uso incorrecto
127Comando No encontrado
126No es un ejecutable

La variable Shell $?

La variable shell llamada $? es una variable interna especial la cual contiene el estado de salida del ultimo comando ejecutado.

  • Después de la ejecución de la función shell, $? retorna el estado de salida del ultimo comando ejecutado en una función.
  • Después de la ejecución de un código shell, $? retorna el estado de salida del ultimo comando ejecutado en el código.

Ejemplo de Código Shell que Explica el Estado de Salida

El siguiente es un código shell que muestra ejemplos de varios estados de salida de comandos:

$ cat exitstatus.sh
#! /bin/bash

echo -e "Ejecutado con Exito"
echo -e "====================="
echo "hola mundo"
# El estado de salida devuelve 0, porque el comando se ejecuto con exito
echo "Estado de Salida" $?

echo -e "Uso Incorrecto"
echo -e "====================="
ls --option
# Uso Incorrecto, por eso el estado de salida sera 2
echo "Estado de Salida" $?

echo -e "Comando no encontrado"
echo -e "====================="
bashscript
# El estado de salida devuelve 127, por que el codigo bash no encontro el comando.
echo "Estado de Salida" $?

echo -e "Comando no es un ejecutable"
echo -e "============================="
ls -l execution.sh
./execution.sh
# El estado de salida devuelve 126, por que no es un ejecutable
echo "Estado de Salida" $?

Ahora ejecuta el script exitstatus.sh para ver los resultados.

miércoles, 3 de marzo de 2010

Ejemplos de Codigo Bash

Shell es un programa que interpreta comandos. Los comandos son ingresados directamente por el usuario o leídos desde un archivo llamado shell script.

Shell es llamado como shell interactivo cuando lee la entrada desde el usuario directamente.

Shell es llamado shell no-interactivo cuando lee los comandos desde un archivo y los ejecuta. En este caso shell lee cada linea del código en el archivo desde el principio hasta el final y ejecuta cada comando como si lo hubiera tipeado el usuario directamente.

Imprime el valor de la variable shell $-, para saber si el shell es interactivo o no.

# echo $-
himBH

Nota: La variable $- contiene una "i" lo cual indica que es interactivo.

Unix tiene una variedad de Shell. Bourne shell (sh), Bourne again shell (bash), C shell (csh), Korn shell (ksh), Tenex C shell (tcsh). Usa el comando where o whereis para encontrar donde esta localizado el shell especifico tal como se muestra a continuación:

# which bash
/bin/bash

# whereis bash
bash: /bin/bash /usr/share/man/man1/bash.1.gz

Puedes intercambiar entre los shells escribiendo el nombre del shell. Por ejemplo escribe csh para cambiar al C shell.

Escribir y Ejecutar Codigo Shell

Ejemplo 1. Código Bash de Hola Mundo

1) Crear un script escribiendo las siguientes lineas en un archivo usando tu editor favorito:

$ cat holamundo.sh
#!/bin/bash
echo Hola Mundo

2) Puedes escoger cualquier nombre para el archivo. El nombre del archivo no debe ser igual a cualquier comando de Unix o Linux.

3) El script siempre empieza con dos caracteres '#!' el cual es llamado she-bang. Esto indica que es un archivo de código y debe ser ejecutado usando un interprete (/bin/bash) especificado por el resto de la primera linea en el archivo.

4) Ejecutar el script tal como se muestra abajo:

$ bash holamundo.sh
Hola Mundo


5) Cuando ejecutas el comando "bash holamundo.sh", este inicia el shell no-interactivo y pasa el nombre del archivo como argumento a este.

6) La primera linea indica al sistema operativo cual es el shell que se usara para ejecutar el código.

7) En el ejemplo anterior el interprete bash es el que interpreta el código y ejecuta los comandos uno por uno desde el principio hasta el final.

8) Puedes ejecutar el código sin necesidad de usar el bash:

  • Cambia los permisos del archivo para permitir que el usuario lo ejecute usando el comando chmod u+x holamundo.sh.
  • El directorio que contiene el archivo debe estar incluido en la variable de entorno PATH. Si no esta incluida, puedes ejecutar el script especificando toda la ruta del mismo.

9) echo es un comando que muestra el argumento que se le da. Tambien se usa para imprimir el valor de una variable.

Ejemplo 2. Imprimir un Mensaje de Bienvenida al Logearse

Escribe el siguiente contenido en tu archivo ~/bash_profile. Si no existe crea un archivo con el siguiente contenido:

$ cat ~/.bash_profile
hname=`hostname`
echo "Bienvenido a $hname."

Cuando te logeas a un shell interactivo veras el mensaje de bienvenida tal como se muestra:

root@dev-db's password:
Bienvenido a dev-db


Ejemplo 3. Imprimir Información Relacionada al Sistema

Cuando te logeas a un shell interactivo podría mostrarte el nombre del kernel instalado en el servidor, la versión del bash y hora en el servidor.

$cat ~/.bash_profile
hname=`hostname`
echo "Bienvenido a $hname."

echo -e "Detalles del Kernel: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Hora Servidor: "; date

Cuando lanzas un shell interactivo se imprime el siguiente mensaje:

root@dev-db's password:
Bienvenido a dev-db

Detalles del Kernel: Linux 2.6.18-128 x86_64
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Hora Servidor : Tue Feb 22 11:24:01 CET 2010


Ejemplo 4. Imprimir los Detalles del Ultimo Logeo

Si varios usuarios usan la misma maquina con el mismo login entonces detalles como la maquina desde donde se esta logeando y la hora del logoe, serian detalles muy útiles. Este ejemplo imprime detalles del ultimo logeo durante el inicio de un shell interactivo.

$ cat ~/.bash_profile
hname=`hostname`
echo "Bienvenido a $hname."

echo -e "Detalles del Kernel: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Hora Servidor : "; date


lastlog | grep "root" | awk {'print "Ultimo logeo desde: "$3

print "Fecha y Hora del Ultimo Logeo: ",$4,$5,$6,$7,$8,$9;}'

Durante el inicio veras el siguiente mensaje:

root@dev-db's password:
Bienvenido a dev-db

Detalles del Kernel: Linux 2.6.18-128 x86_64
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Hora Servidor : Tue Feb 22 11:24:01 CET 2010


Ultimo logeo desde : user-laptop

Fecha y Hora del Ultimo Logeo: Tue Feb 22 11:24:01 +0100 2010


Ejemplo 5. Exportar Variables y Configurar Alias durante el Inicio

Los comandos mas comunes que veras en tus archivos .bashrc y .bash_profile son los comandos export y alias.

Un alias es simplemente una pieza de texto que sustituye a otra. Cuando ejecutas un alias, este simplemente reemplaza lo que escribiste con el alias. Por ejemplo, si deseas configurar un alias para el comando ls para listar archivos/directorios con los colores, haz lo siguiente:

alias ls 'ls --color=tty'

Si añades este comando a un archivo de inicio puedes ejecutar el comando ls el cual sera reemplazado automáticamente por el comando ls –color=tty.

El comando export es usado para configurar una variable de entorno. Varias variables de entorno son usadas por el sistema u otras aplicaciones. Estas simplemente son una forma de configurar parámetros que cualquier aplicación/script puedan leer. Si configuras una variable sin el comando export, la variable solo existirá para ese proceso en particular.

En el siguiente ejemplo se muestra como exportar la variable de ambiente HISTSIZE. La linea que empieza con # es un comentario.

$ cat /etc/profile
alias ls 'ls --color=tty'

# Configurar alguna variable de entorno
export HISTSIZE=1000

PATH=$PATH:$HOME/bin:/usr/bin:/bin/usr:/sbin/etc

export PATH

export SVN_SH=${SVN_RSH-ssh}