Hablando de UNIX: Cambio de imagen de shell extremo

Rompa con la cafeína, el esfuerzo y su editor de texto. Llegó el momento de convertir su shell UNIX en un hot rod. Llegó el momento de un cambio de imagen de shell extremo.

Martin Streicher, Software Developer, Pixel, Byte, and Comma

author photo - martin streicherMartin Streicher es desarrollador independiente de Ruby on Rails y anterior Editor en Jefe de Linux Magazine. Martin tiene Maestría en Ciencias de la Computación de la Universidad de Purdue y ha programado sistemas similares a UNIX desde 1986. Él colecciona arte y juguetes. Puede contactar a Martin escribiendo a martin.streicher@gmail.com.



15-08-2011

No importa qué carro conduzca, debe apreciar el hot rod. No hay nada como un Dodge Charger 1969 con rines de magnesio de cinco rayos, neumáticos anchos, un acabado negro medianoche, un montón de cromo y un motor grande e intimidante. Es una obra maestra — el auto que Rodin El Pensador conduciría. Un clásico.

El shell UNIX® es también un clásico (aunque sin las enormes salpicaderas). Pero con un poco de esfuerzo, trabajo mecánico y modificaciones de accesorios, puede verse y comportarse como un hot rod. Puede llamar a esto "Top Gear-head" o "Cambio de Imagen de Shell Extremo". ¡Yo lo llamo genial!

Tiene partes móviles

Debajo de ese prompt parpadeante, su shell — ya sea Bash, Z shell o algo más — tiene muchas partes móviles que es posible aumentar, afinar y ajustar. Aquí hay un resumen (ya que muchos de estos han sido discutidos a detalle en columnas previas):

  • Un alias puede abreviar frases de nombres de comando y línea de comando. Por ejemplo, crear alias ll 'ls -hlt' reduce una línea de comando comúnmente utilizada a sólo dos letras — menos qué escribir y menos qué recordar. Frecuentemente, un alias abrevia literales. Sin embargo, muy parecido a un script shell o a una función shell, un alias también puede aceptar parámetros. El comando alias print 'lpr -h -Pps5 \!*' reemplaza \!* con argumentos de línea de comando. Por lo tanto, escribir print manual.ps schematic.ps form.ps es expandido a lpr -h -Pps5 manual.ps schematic.ps form.ps.
  • Las variables de entorno persisten los valores a través de los comandos, aún comandos que generan nuevos procesos. Algunas variables de entorno tienen un significado especial debido a la convención: PRINTER es reconocido por los comandos y aplicaciones como su dispositivo de salida preferido, mientras que EDITOR y PAGER indican qué editor de texto y visor utilizar para modificar y mostrar el texto, respectivamente. Otras variables de entorno están relacionadas con utilidades individuales. Un ejemplo es PS1. Le dice a su shell qué representar para su prompt inicial. Otra variable de entorno de trabajo duro es el PATH del shell, que enumera los directorios a buscar para un ejecutable. (Para saber qué variables de entorno son reconocidas en una aplicación o comando específico, busque una sección llamada "Environment variables" en su página de manual).
  • Las funciones también pueden ser llamadas desde la línea de comando y llenar la brecha entre un alias y un script en toda regla. Por ejemplo, si necesita manipular argumentos o aplicar lógica, un alias probablemente será insuficiente; sin embargo, un script entero podría ser excesivo. Las funciones también pueden ser combinadas para conseguir efectos acumulativos. Usted necesita un mínimo de conocimientos de programación para crear funciones, pero nada oneroso.
  • Las opciones de shell controlan el comportamiento del shell. Las opciones de shell varían típicamente de shell en shell, y un shell enriquecido, como Bash o Z shell, puede tener cientos de parámetros que se pueden afinar. (El Z shell tiene una página de manual dedicada, zshoptions, sólo para la configuración de documentos.) Por ejemplo, si habilita la opción Z shell pushd_ignore_dups, pushd no empujará un directorio en la pila de directorios si ya se encuentra ahí. Es posible literalmente gastar horas explorando las opciones. Una vez que encuentre la combinación que desea mantener, escriba set (Bash) o setopt y redirija la salida a un archivo. Es posible copiar algunos o todos los valores capturados a un archivo de inicio para recrear su espacio de trabajo cada vez que abre un shell.

Además de este equipamiento y aprovechamientos, puede cambiar la apariencia de su shell. El prompt de signo de dólar indefinido ($) puede lucir colores, reflejar su directorio de trabajo actual e incluso mostrar el clima. Si es posible capturar fragmentos de información con un comando, probablemente pueda mostrar esos datos en el prompt.


Como una tela a rayas

Al igual que otras operaciones en el shell, una variable de entorno controla lo que ha sido dibujado cada vez que el shell presenta un prompt. La variable PS1, o "prompt string level 1", es interpretada al representarse igual que la línea de comando misma. PS1 puede contener otras variables de entorno y shell, evaluación de comandos en el lugar (mediante apóstrofes) y literales especializados. Este es un ejemplo inicial:

$ export PS1="\u@\h \w >"
strike@nostromo ~ > whoami; hostname; pwd
strike
nostromo
/home/strike
strike@nostromo ~ >

Inicialmente, el prompt fue simple $. Establecer la variable de entorno PS1 (por lo tanto, export en lugar de set) a \u@\h \w > representa su nombre de usuario (el significado de \u), la literal @, su nombre de host (\h), su directorio de trabajo actual (\w) y la serie literal >.

Otras literales especiales incluyen \t para la hora (en formato de 24 horas), \d para la fecha (en formato de día de la semana, mes y año), y \! para el número de historial de shell. Si mantiene abierta su ventana shell durante periodos prolongados, puede repetir rápidamente un comando previo con !nnn, donde nnn es el número mostrado en el prompt para el comando.

strike@nostromo ~ > export PS1="\! $ "
776 $ find . -name ...
...
999 $ !776
find . -name ...
1000 $

¿Se ha preguntado alguna vez cómo la línea de comando shell cambia al signo de número (#) siempre que es o se comporta como el superusuario, raíz? De forma predeterminada, el prompt estándar es en realidad el operador especial \$. Si su ID de usuario efectivo es 0, este emite #; de lo contrario, emite un $.

Las abreviaciones también existen para cambiar colores. Aquí hay otra muestra para demostrar:

strike@nostromo ~ > export PS1='$ '
$ blue='\e[0;34m'
$ none='\e[m'
$ export PS1="$blue\u@\h$none\w>"
<span style="color: blue;">strike@nostromo </span>~ ><br />

La abreviatura \e[0;34m, que es más difícil de manejar, habilita el azul. Su complemento, \e[m, restablece el color representado al predeterminado para su ventana shell. Ambos códigos son adjuntados en comillas individuales para prevenir que el shell interpole caracteres que tengan un significado especial. Este ejemplo también muestra que usted también puede usar variables en un prompt. Aquí, las variables blue y none están expandidas cuando la línea de comando es interpretada, y el prompt se establece en la cadena de caracteres que resulta de la expansión. Si desea expandir una variable dinámicamente cada vez que el prompt es representado, debe escapar su interpretación cuando se establece. Echemos un vistazo a eso:

<span style="color: blue;">strike@nostromo 
    </span>~ >export PS1="\$somevar $ "
$ somevar="hello"
hello $

La frase \$somevar escapa el signo de dólar, evitando la interpretación de la variable en el comando donde el prompt es establecido. En su lugar, la interpretación ocurre siempre que el prompt es dibujado. Si somevar cambia debido a otros comandos, el prompt muestra su nuevo valor.

Usted también puede llamar cualquier comando o función en el prompt, como se mencionó anteriormente. Simplemente use los apóstrofes (``). Por ejemplo, si usa Ruby Version Manager para cambiar las versiones de lenguaje e intérpretes de Ruby, tal vez quiera saber qué binario de Ruby está activo. Existen dos enfoques:

hello $ export PS1="(`which ruby`) \w $ "
(/Users/strike/.rvm/rubies/ruby-1.9.2-p0/bin/ruby) ~ $

Esta primera técnica aplica which para encontrar el primer ejecutable de Ruby en la PATH actual. Esta técnica siguiente consigue la misma meta pero demuestra qué tan compleja puede ser una evaluación de comandos en el lugar. Si usted establece el prompt para la cadena de caracteres:

"(`rvm info | grep 'ruby:' | grep bin | cut -f2 -d: | tr \\" ' '`)"

obtiene el mismo resultado, aunque con más rodeos.

Por cierto, tal vez se ha preguntado por qué PS1 es "prompt string level 1". ¿Existen otros niveles de prompt? La respuesta es sí. Las variables de entorno existen para PS2, PS3 y PS4, y estos prompts aparecen siempre que abre un nuevo bloque. Esta es una aparición:

$ for i in [A-Z]*
>

Después de que escribe for i in [A-Z]* y presiona Return, el shell presenta el prompt PS2 (el predeterminado es >) para resaltar que se encuentra ahora dentro del cuerpo del bucle for . En otras palabras, se encuentra ahora "anidado" en el bucle o en el siguiente nivel más profundo. Si termina el bucle con done, el prompt de primer nivel reaparece.

$ for i in [A-Z]*
> do
> echo $i
> done
Gemfile
Gemfile.lock
README
Rakefile
$

De hecho, un nuevo prompt aparece siempre que no complete la línea de comando en el prompt anterior. Esto explica por qué unas comillas simples o dobles sin coincidencia hacen que aparezca un prompt nuevo. El shell lo invita a continuar lo que empezó.

Intercalar información en el prompt es una excelente forma de realizar el seguimiento del estado, como su host actual, directorio de trabajo y más. Una vez que crea un prompt que le gusta, distribuya sus archivos de inicio del shell en todas sus cuentas. Si, como la mayoría de los usuarios modernos, su pantalla se llena con ventanas shell remotas, los prompts pueden ayudarle a distinguir unas de otras. Podría crear una función para cambiar el prompt a un color distinto en cada host.


Modders y rodders

Personalizar el shell es un eterno pasatiempo geek, y puede encontrar mucha inspiración y código de origen online para encontrar su propio trabajo. Dos fuentes merecen una mención especial: Oh My Z Shell! y Bash It!. La primera es para usuarios de Z shell, y la segunda es para aficionados de Bash. Ambas son una colección de modificaciones shell, incluyendo terminaciones, temas (colores y prompts), funciones y archivos "dot" ya hechos. Ambas son de código abierto y están disponibles en github. Aquí probaremos Oh, My Z Shell! (o OMZ! para abreviar). Debe tener Z shell versión 4.3.9 o posterior para usar el código.

Puede instalar el paquete y cambiar su shell a Z shell automáticamente con wget, como muestra el Listado 1 .

Listado 1. Instalar y cambiarse a Z shell
$ wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
...
Cloning Oh My Zsh...
Cloning into /Users/strike/.oh-my-zsh...
remote: Counting objects: 1312, done.
remote: Compressing objects: 100% (750/750), done.
remote: Total 1312 (delta 796), reused 944 (delta 520)
Receiving objects: 100% (1312/1312), 153.63 KiB, done.
Resolving deltas: 100% (796/796), done.
Looking for an existing zsh config...
Using the Oh My Zsh template file and adding it to ~/.zshrc
Copying your current PATH and adding it to the end of ~/.zshrc for you.
Time to change your default shell to zsh!
Changing shell for strike.
Password for strike:
chsh: /usr/bin/env zsh: non-standard shell
         __                                     __
  ____  / /_     ____ ___  __  __   ____  _____/ /_
 / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \
/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / /
\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/
                        /____/

Opcionalmente, puede instalar el kit manualmente. Hacerlo así es más recomendable si está ejecutando otro shell y sólo desea probar Z shell. Use Git para clonar el paquete, y después ejecute zsh:

$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
$ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
$ zsh

Deberá ver una pantalla y un prompt que se parece a la Figura 1. Entonces el predeterminado para OMZ! es llamado "robbyrussell," nombre homónimo del administrador de OMZ! Puede cambiar este a cualquiera de los temas listados en ~/.oh-my-zsh/themes. Para cambiar un tema, abra el archivo ~/.zshrc y establezca la variable ZSH_THEME en el nombre base del archivo de tema. Por ejemplo, para usar cloud.zsh-theme, establezca ZSH_THEME=cloud.

Figura 1. Cambiando el tema de su shell
Cambiando el tema de su shell

Probablemente notará que mucha de la información del estado de impresión del tema está en el prompt y en el extremo derecho del prompt. Por ejemplo, el tema Clean imprime la hora actual en el extremo derecho. Los emuladores de pantalla normalmente no incluyen una línea de estado en el fondo (a diferencia de sus progenitores de hardware) pero pueden usar el estado real localizado a la derecha del prompt para retroalimentación dinámica. ¿Recuperar los divertidos códigos \e[ para establecer los colores en el prompt? Existe un conjunto extensivo de dichos "escapes" para mover el cursor alrededor de una ventana. Además, en lugar de utilizar símbolos y números arcanos, los sistemas UNIX modernos utilizan tput para buscar y emitir escapes por nombre o propósito. Z shell usa todos estos trucos para proporcionar un RPS1 y RPS2 para prompts del lado derecho en las líneas iniciales y subsecuentes, respectivamente.

Más allá de los tratamientos temáticos de colores y prompts, OMZ! incluye plug-ins que se agrupan como funciones y dispositivos. Si usa Git para control de origen, por ejemplo, es posible habilitar el plug-in Git OMZ! para modificar su prompt con el estado de Git. De nuevo, abra el archivo ~/.zshrc y edite la línea de plug-ins para que incluya git>. Ahora, cuando cambie a un repositorio de Git, el prompt refleja el estado. Por ejemplo, la Figura 2 muestra el tema Clean y un repositorio con modificaciones que no se han representado.

Figura 2. El tema Clean y el repositorio
El tema Clean y el repositorio

Inteligentemente, el prompt muestra la rama actual ("rubricmods") y una X roja, indicando que el repositorio actual está sucio o que los archivos locales han sido modificados pero no confirmados. Una vez que las revisiones son confirmadas, la X es desvanecida. El plug-in Git también agrega alias útiles para combinaciones comunes de comandos Git y finalizaciones sensibles al contexto para opciones de Git. Intente uno: si escribe git branch seguido de la tecla Tab, el plug-in Git enlista las ramas disponibles. Existen otros plug-ins para Mac OS X, desarrollo de Ruby on Rails, MySQL y más. Algunos de los plug-ins son ligeros, quizá no más de una o dos funciones o algunos alias; otros plug-ins son más grandes.

Dirpersist es un buen escaparate de las intenciones de los plug-ins de OMZ! Dirpersist salva y restaura su pila de directorios a través de invocaciones de shell, preservando así el estado importante, de forma que puede retomar el trabajo donde lo dejó. Para usarlo, agregue el plug-in en su ~/.zshrc. El origen del plug-in es breve y se muestra en el Listado 2.

Listado 2. Origen del plug-in OMZ!
#!/bin/zsh
#
# Make the dirstack more persistent
#
# Add dirpersist to $plugins in ~/.zshrc to load
#

# $zdirstore is the file used to persist the stack
zdirstore=~/.zdirstore

dirpersistinstall () {
  if grep 'dirpersiststore' ~/.zlogout > /dev/null; then
  else
    if read -q \?"Would you like to set up your .zlogout file for 
        use with dirpersist? (y/n) "; then
      echo "# Store dirs stack\n\
        # See ~/.oh-my-zsh/plugins/dirspersist.plugin.zsh\ndirpersiststore" >> ~/.zlogout
    else
      echo "If you don't want this message to appear, remove dirspersist from \$plugins"
    fi
  fi
}

dirpersiststore () {
  dirs -p | perl -e 'foreach (reverse <STDIN>) {\
    chomp;s/([& ])/\\$1/g ;print "if [ -d $_ ]; then pushd -q $_; fi\n"}' > $zdirstore
}

dirpersistrestore () {
  if [ -f $zdirstore ]; then
    source $zdirstore
  fi
}

DIRSTACKSIZE=10
setopt autopushd pushdminus pushdsilent pushdtohome pushdignoredups

dirpersistinstall
dirpersistrestore

# Make popd changes permanent without having to wait for logout
alias popd="popd;dirpersiststore"

El plug-in está compuesto de tres funciones, un puñado de opciones de shell y un alias para popd que persiste la pila de directorios con cada operación pop. El plug-in también inicializa su entorno, creando un lugar para almacenar la pila de directorios y, al modificar el archivo de cierre de sesión, ~/.zlogout, para persistir la pila de directorios en cualquier momento en que cierre su sesión. Como puede ver, es fácil crear un nuevo plug-in, y puede construir uno alrededor de cualquier conjunto de comandos shell.

Si le gusta OMZ! pero usa el shell Bash, pruebe Bash It! Fue inspirado por OMZ! y tiene una operación similar. Bash It también ofrece plug-ins para Subversiones y nginx.


Quemando caucho virtual

Abra por completo la cubierta de OMZ! o Bash It! para ver qué hace funcionar a las personalizaciones de shell. También puede encontrar sabiduría e innovación buscando en la Web la frase "dot files": muchos reductores UNIX publican configuraciones de shell personales online para que otros las escojan. Aquí está también un consejo: mantenga sus archivos dot en algún tipo de control de versiones. Dado un repositorio, probablemente se sentirá más cómodo experimentando con el cambio y con otros shells. Puede regresar a una versión anterior si comete un error o mantener las variaciones para shells o escenarios particulares. El shell es flexible y dinámico, y un tamaño no necesita ajustarse a todos. Una vez que tenga un conjunto de atractivos "archivos dot", compártalos con otros. Presumir sus archivos dot tal vez no le consiga un papel principal en la siguiente película de 'Rápido y Furioso', pero seguramente impulsará su credibilidad geek.

Recursos

Aprender

  • Z shell: Puede encontrar el origen de Z shell y extensa documentación y tutoriales en la página de proyecto de shell.
  • Documentación Bash: Lea más sobre Bash shell y el cursor terminal y las opciones de representación.
  • Oh My Z Shell!: Eche un vistazo al proyecto de código abierto para agregar extensiones y atajos útiles para Z shell.
  • Bash It!: Ese proyecto de comunidad proporciona una infraestructura de extensiones y conveniencia para Bash shell.
  • Muchos desarrolladores y proyectos de código abierto mantienen el código bajo control de versiones con Git y github.
  • Hablando de UNIX: Eche un vistazo a otras partes de esta serie.
  • Zona developerWorks de AIX y UNIX: La zona de AIX y UNIX proporciona mucha información relacionada con todos los aspectos de la administración de sistemas AIX y la expansión de sus habilidades de UNIX.
  • Principiante en AIX y UNIX? Visite la página de Principiante en AIX y UNIX para aprender más.
  • Librería de tecnología: Explore la librería de tecnología para encontrar libros sobre este y otros temas técnicos.

Obtener los productos y tecnologías

  • Bash shell: Descargue el origen de Bash shell desde GNU Software Foundation.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java
ArticleID=751594
ArticleTitle=Hablando de UNIX: Cambio de imagen de shell extremo
publish-date=08152011