Strange feature in bash script
Today, while programming (or reprogramming) some parts of one script, I’ve noticed a strange thing.
First, the two scripts.
The working one:
1 2 3 4 5 6 7 8 | #!/bin/bash let x=0 echo -e "a\nb\nc\nd" > auxfile while read LINE do [[ "${LINE}" =~ ^(a|c|d)$ ]] && AUX[$x]=${BASH_REMATCH[1]} && let x++ done < auxfile echo ${AUX[@]} |
And the not working (for my purpose):
1 2 3 4 5 6 7 | #!/bin/bash let x=0 echo -e "a\nb\nc\nd" | while read LINE do [[ "${LINE}" =~ ^(a|c|d)$ ]] && AUX[$x]=${BASH_REMATCH[1]} && let x++ done echo ${AUX[@]} |
The only difference between both is just the piped while.
Someone can explain why seems to be a “reset vars” at the end of the piped while?
Ciclo Herramientas gnu/linux (IV): roxterm y urxvt
Hoy comento una utilidad que no es de consola (MOG!), sino una “consola” en sí; vaya un emulador de terminal.
Por supuesto, en la búsqueda de “algo” ligero, configurable y con suficientes “features” nos hace pasar por la página de “lightweight applications” en la wiki de Arch.
Diría que he probado todos:
- LilyTerm: Violación de segmento al arrancar la 2ª ventana, diría que tiene procesos separados para cada ventana.
- Sakura: Procesos independientes, no excesivamente pesado.
- Xterm: Procesos independientes, pesado.
- Tilda: Procesos independientes, pesado.
- Stjerm: no me gusta el dropdown, partiendo de eso, no lo he probado demasiado.
- urxvt: Muy buen combo urxtvd+urxvtc, lo he estado usando hasta que se han solucionado los problemas del roxterm
- ROXTerm: Un proceso por N ventanas, muy ligero
Lo que busco en un terminal (imagino que lo que todos ¬¬’):
- Custom colors: básico para ver los colorines de nuestro tty!!! (htop rulez)
- Custom Shortcuts: hay que poner las cosas como a uno le gusta, no como alguien te obligue ;-)
- Lightweight: por descontado
- Mult-tabs/Multi-windows
Para apreciar la diferencia con urxvtd, pongo una captura de la memoria, ambos con las mismas pestañas, ejecutando los mismos procesos en ellas:
1 2 | dodger 1240 0.0 2.9 447892 60588 ? S Sep09 8:47 urxvtd -q -o -f dodger 24726 0.9 0.9 53812 19676 pts/15 Sl 17:57 0:03 roxterm |
Como comentaba antes, Roxterm ha tenido problemas con la configuración de los shortcuts durante unas cuantas versiones, al menos en mi caso. Y he estado usando urxvtd+urxvtc, también de manera muy satisfactoria.
La verdad que el sistema de configuración mediante .Xdefaults es un poco… arcaico, pero al final te acostumbras.
Tiene cosas buenas, como por ejemplo el cambio de pestaña mediante “ALT + ->” y “ALT + <-" y una cosa que a todo geek le gustará que son las tabs en ASCII si se ejecuta el urxvt mediante:
1 | urxvtc -pe tabbed |
De momento, me quedo con roxterm (aunque las pestañas en GTK no molen tanto), sí que ocupa mucho menos y los ficheros de configuración son “humanos”, tal vez no admita las 10e10 opciones de urxvt, pero sí que admite las necesarias ;-)
Ahora pongo la config que he estado usando para urxvt
1 | vi .Xdefaults |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | ! General urxvt*termName: rxvt urxvt*loginShell: true urxvt*scrollBar: true urxvt*scrollBar_right: true urxvt*secondaryScroll: true URxvt*scrollstyle: plain urxvt*saveLines: 65535 urxvt*cursorBlink: false urxvt*urgentOnBell: true !urxvt*override-redirect:false !urxvt*borderLess: false !urxvt*internalBorder: 0 !urxvt*externalBorder: 0 ! Extensions urxvt*perl-lib: /usr/lib/urxvt/perl/ urxvt*perl-ext-common: default,matcher,searchable-scrollback urxvt*urlLauncher: /usr/bin/firefox urxvt*matcher.button: 1 ! - catch ugly URLs ! Tabs ! Appearance ! - use a bitmap font !urxvt*font: -*-terminus-medium-*-*-*-12-*-*-*-*-*-*-* !urxvt*boldFont: -*-terminus-bold-*-*-*-12-*-*-*-*-*-*-* !URxvt*font: xft:DejaVu Sans Mono:pixelsize=12:antialias=true:hinting=true URxvt*font: xft:Monospace:pixelsize=12:antialias=true:hinting=true URxvt*boldFont: xft:Monospace:bold:pixelsize=12:antialias=true:hinting=true ! - use xft for drawing fonts !urxvt*font: xft:Terminus:5 !urxvt*font: 9x20 ! - cursor urxvt*cursorColor: #DCDCCC ! - pseudo transparency !urxvt*shading: 50 !urxvt*transparent:true ! ! - color scheme !urxvt.background: #000000 urxvt.background: #171717 urxvt.foreground: #EBEBFF ! black + red !urxvt*color0: #3f3f3f urxvt*color0: #000000 urxvt*color1: #e01010 ! green + yellow urxvt*color2: #00AA00 urxvt*color3: #FFFF00 ! blue + purple ! urxvt*color4: #112037 urxvt*color4: #4092cf urxvt*color5: #A020F0 ! cyan + white urxvt*color6: #5B5BC7 urxvt*color7: #fefefe ! bright-black + bright-red urxvt*color8: #6a6a6a urxvt*color9: #FF5555 ! bright-green + bright-yellow urxvt*color10: #90EE90 urxvt*color11: #ffff2f ! bright-blue + bright-purple urxvt*color12: #5B5BC7 urxvt*color13: #e628ba ! bright-cyan + bright-white urxvt*color14: #7D7DFB urxvt*color15: #ffffff |
Mi configuración de colores de roxterm:
1 | vi .config/roxterm.sourceforge.net/Colours/dodger |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | [roxterm colour scheme] foreground=#eeeeeeeeecec background=#000000000000 0=#2e2e34343636 1=#cccc00000000 2=#4e4e9a9a0606 3=#c4c4a0a00000 4=#34346565a4a4 5=#757550507b7b 6=#060698989a9a 7=#d3d3d7d7cfcf 8=#555557575353 9=#efef29292929 10=#8a8ae2e23434 11=#fcfce9e94f4f 12=#72729f9fcfcf 13=#adad7f7fa8a8 14=#3434e2e2e2e2 15=#ffffffffffff 16=#4c4c4c4c4c4c 17=#a8a830303030 18=#202088882020 19=#a8a888880000 20=#555555559898 21=#888830308888 22=#303088888888 23=#d8d8d8d8d8d8 cursor=#eeeeeeeeecec palette_size=16 |
Y los shortcuts:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | vi .config/roxterm.sourceforge.net/Shortcuts/dodger [cc] [cc lang="bash"] [roxterm shortcuts scheme] File/New Window=<Shift><Control>n File/New Tab=<Alt>t File/Close Window=<Shift><Control>q File/Close Tab=<Shift><Control>w Tabs/Previous Tab=<Shift>Left Tabs/Next Tab=<Shift>Right Edit/Copy=<Shift><Control>c Edit/Paste=<Shift><Control>v View/Zoom In=<Control>plus View/Zoom Out=<Control>minus View/Normal Size=<Control>0 View/Scroll Up One Line=<Shift>Up View/Scroll Down One Line=<Shift>Down Help/Help=F1 Edit/Copy & Paste=<Shift><Control>y File/New Window With Profile/Default= File/New Tab With Profile/Default= |
Para aplicar estos cambios:
1 2 3 | cp .config/roxterm.sourceforge.net/Global .config/roxterm.sourceforge.net/Global.backup sed -i 's,colour_scheme=.*,colour_scheme=dodger,g' .config/roxterm.sourceforge.net/Global sed -i 's,shortcut_scheme=.*,shortcut_scheme=dodger,g' .config/roxterm.sourceforge.net/Global |
El backup es por si acaso, nunca está de más ;-)
La importancia de IT
Resulta que tengo contacto con una persona no-informática que trabaja en una empresa no-informática en la que tienen un departamento IT un tanto… especial.
Todo hay que decirlo que mi conocido es bastante enterado a nivel tecnológico y bastante ágil mentalmente, no como el resto del personal.
Pongámos el [MODO WARDOG ON] y en primera persona, con $CURRANTE como protagonista.:
Riiing…Riinggg, $CURRANTE: “departamento marrón, dígame”
$RECEPCION: “nos han llegado el nuevo datáfono y va sin conexiones, creo que pone algo de que necesita una conexión Wifi de esas.”
$CURRANTE: Vale, hablaré con $IT para que le echen un vistazo y lo conecten. PlinkRiiing…Riinggg, $IT: “Departamento inútil, dígame!”
$CURRANTE: hola, necesito que…
$IT: Espera que voy. Plink.Pero si no le he dicho nada, para qué va a venir, por teléfono ya se lo puedo explicar todo
$IT: que pasa $CURRANTE, no podéis vivir sin nosotros, eh!
$CURRANTE: Seguro! Mira, el banco $LADRONES nos ha enviado un magnífico datáfono de 2ª mano, es una basura, pero habrá que ir tirando.
$IT: Y?
$CURRANTE: Pues eso, que es Wifi, y no tenemos wifi!
$IT: Uff, pues eso va a tardar eh, por que no tenemos ningún AP, hay comprarlo, configurarlo… uff eso tardará eh!!
$CURRANTE: Pero si no tenéis nada urgente ahora mismo! Y esto no puede ser tan dificíl, cualquiera tiene una wifi en su casa!
$IT: Mira, mandamé un mail y ya lo miraremos, adiossssSSssY ahí me quedo, con cara de tonto… voy a consultarlo con $dodger.
$CURRANTE: Oye, $dodger, esto de configurar una wifi… es muy difícil?
$dodger: Pues no, tan difícil como cambiar 2 passwords y un par de opciones, hasta el caracol de bob esponja sabría hacerlo.
$CURRANTE: Pues por aquí me dicen esto…
$dodger: Eh, te paso mi currículum, que me paguen lo que a los 4 informáticos que tenéis y tendréis ALL-IN-ONE.
$CURRANTE: Echo, si no fuese por la alta tensión… ya sabes.Pues nada, dedico comentarlo a ${INUTIL-BOSS[1]} a ver si es capaz de por una vez meterles un puro a los de $IT.
${INUTIL-BOSS[1]}: qué quieres piltrafilla, algo del departamento marrón a compartir?.
$CURRANTE: Pues mira … (explico la situación).
${INUTIL-BOSS[1]}: Uff… es que eso de la wifi… eso va a dejar de existir!
$CURRANTE: Como?
${INUTIL-BOSS[1]}: Si si, no ves que eso emite muchas radiaciones perjudiciales para la salud, no creo que los $HYPERBOSSES lo permitan, por la salud del trabajador ya sabes.
$CURRANTE: COMO?
${INUTIL-BOSS[1]}: No pongas esa cara, ya se sabe que lo mejor es ir con cables. No te preocupes, si es necesario, se pondrá un aparato de esos, pero que lo enciendan solo cuando lo necesiten.
$CURRANTE: Are you fucking kidding me?
${INUTIL-BOSS[1]}: me voy a dar una disertación sobre radioactividad a Fukushima, Adios!!!No me puedo creer que haya tal inutilidad… preguntaré a $dodger a ver…
$CURRANTE: Oye $dodger, ${INUTIL-BOSS[1]} me ha dicho … blablabla
$dodger: LOL. Gracias, hoy ya no necesito hacer abdominales con todo lo que me he reído.
[MODO WARDOG OFF]
Esto demuestra varias cosas:
- Que cualquiera puede hacer de IT si tiene un poco de enchufe (con perdón, Gary)
- Que cualquiera puede ser jefe aplicando la regla anterior
- Lo importante que es tener alguien que ponga los pies en el suelo a la peña
- Que IT es un departamento importante en una empresa, no conviene rodearse de inútiles.
Ciclo Herramientas gnu/linux (III): screen (gnu/screen)
Y llegamos a una de mis herramientas favoritas y sin la que prácticamente no me planteo la administración de un servidor.
Sobre todo conociendo como van las conexiones españolas.
Haciendo copy/paste del manual:
Screen is a full-screen window manager that multiplexes a physical terminal between several processes (typically interactive shells).
Tradución/interpretación: Screen es un emulador de terminal des-atachado que permite multiplexación de terminales.
Es decir, permite lanzar un proceso que es no es dependiente de un terminal; ya que todos los procesos de usuario en linux cuelgan de un terminal, aunque los mandemos a background y a no ser que usemos dtach.
Esto soluciona el problema de la reconexión, es decir, lanzar un programa de larga duración sin logar la salida y luego hacer el típico:
Se me ha colgado la conexión y no sé como ha finalizado!!!
Que fijo que a cualquier sysadm le ha pasado, habitualmente por despiste (trollface again).
Aparte de esta propiedad, tiene la gran ventaja de que permite lanzar “pestañas” (por hacer un símil) dentro de la misma conexión, es decir, N shells dentro de una única.
Por supuesto también permite splitting de la ventana en regiones (horizontales y depende de si screen está parcheado, verticales), aunque en mi caso soy contrario a usarlas por que es un poco “paja mental”, pero he de reconocer que en ocasiones viene muy bien.
La configuración la realizamos mediante el típico:
1 | ${HOME}/.screenrc |
Pongo el mío como ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | deflogin on vbell on vbell_msg " Wuff ---- Wuff!! " defscrollback 1024 bind ^k bind ^\ bind \\ quit bind K kill bind I login on bind O login off bind } history termcapinfo vt100 dl=5\E[M hardstatus off termcapinfo xterm*|rxvt*|kterm*|Eterm* hs:ts=\E]0;:fs=\007:ds=\E]0;\007 hardstatus string "%h%? users: %u%?" termcapinfo xterm*|linux*|rxvt*|Eterm* OP termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' defnonblock 5 caption always "%{+b rk}%H%{gk} |%c %{yk}%d.%m.%Y | %72=Load: %l %{wk}" hardstatus alwayslastline "%?%{yk}%-Lw%?%{wb}%n*%f %t%?(%u)%?%?%{yk}%+Lw%?" |
Que nos genera algo como esto (eliminando la parte de htop):

Lo importante son las 2 últimas lineas visibles:
1 2 | ciberterminal |12:12 14.09.2011 | Load: 0,25 0,24 0,18 0*$ bash 1-$ bash 2$ bash 3$ bash 4$ bash |
Donde apreciamos:
- hostname, fecha, load avg.
- “Pestañas” disponibles
De esta forma de manera muy rápida y visual, apreciamos cuantas pestañas tenemos y el estado del servidor.
Otra propiedad adicional e intersante, es el clipboard propio, el scrolling y la posibilidad de salvar lo que aparecen el terminal (todo resumido con el nombre de “copy mode”.
Añado un “resumen” de mis shortcuts más usados, que en este caso son muchos:
| ##CONNECTION## | From outside screen |
screen |
launch a new screen |
screen -S NAME |
launch a new screen with name “NAME” |
screen -m PROGRAM |
launch a screen and inside it the “PROGRAM” |
screen -d -m PROGRAM |
launch a DE-ATTACHED screen and run “PROGRAM” inside |
screen -ls |
launch a new screen |
screen -x |
bruteforce attach |
screen -r SCREENAME |
attach to screen “SCREENAME” |
| ##INSIDE SCREEN## |
|
CTRL-a c |
New screen “tab”/session |
CTRL-a n |
Next “tab” |
CTRL-a p |
Prev “tab” |
CTRL-a N |
Go to tab N |
CTRL-a " |
Tab list |
exit |
exit current tab |
CRTL-d |
exit current tab |
CTRL-a A |
Change Current tab name |
CRTL-a d |
de-attach screen |
CRTL-a C |
clear current tab screen |
CRTL-a l |
reset current tab screen |
CTRL-a K |
Destroy (literally) current tab |
| ##SPLITTING## |
|
CTRL-a S |
Split current tab horizontally |
CTRL-a | |
Split current tab vertically |
CTRL-a <tab> |
Switch to next region |
CTRL-a X |
Close current region |
| ##COPY/PASTE## |
|
CTRL-a <esc> |
Enter copy mode |
<Space> |
Begin selection (use arrows to move) |
<Enter> |
Finish selection and copy |
CTRL-a ] |
Paste |
CTRL-a > |
Write clipboard to file /tmp/screen-exchange |
CTRL-a < |
Read /tmp/screen-exchange to clipboard |
CTRL-a = |
Remove /tmp/screen-exchange but no clipboard content |
| ##SCROLL## |
|
CTRL-a <esc> |
Enter copy mode |
AvPag |
Advance 1 page |
RePag |
Previous page |
Inicio |
Go to the 1st line of scroll |
Fin |
Go to the last line of scroll (actual one) |
CRTL+r <SEARCH STRING> |
Enter Search mode (begin writing), then
CRTL+r to go to the previous ressult |
/<SEARCH STRING> |
Enter VIM-like search |
Ciclo Herramientas gnu/linux (II): finch
Nivel freak rallando el tope…
Un cliente de mensajería instantánea basado en ncurses. Más bien pidgin en ncurses.
Dejando a parte a centerim, el aspecto de finch es igual al de pidgin… solo que en consola.
Es decir, tiene “ventanas”, pestañas (si quieres) y la ventana de amigos. Pero también tiene workspaces dentro del propio programa (algo así como “pestañas” de screen) donde poder clasificar las ventanas: por ejemplo las ventanas de chat en un workspace y la lista de amigos en otro.
Un ejemplo de funcionamiento habitual:

Link al autor de la imagen
Por supuesto cuenta con cliente de los protocolos habituales: jabber, msn, irc, icq…
Como se puede ver en la página del manual, parte de la configuración se realiza en el finchero:
1 | ${HOME}/.gntrc |
En mi caso por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | [Finch] mouse = 1 color-available = green; black color-away = blue; black color-idle = gray; black color-offline = red; black color-message-sent = cyan; default color-message-received = red; default color-message-highlight = black; green color-message-action = yellow; default color-timestamp = blue; default #See below for details on color [general] shadow = 0 # There is experimental mouse support mouse = 1 # To use some custom window-manager wm = /usr/local/lib/gnt/s.so # There's also a custom window manager called irssi.so # Remember window-positions based on the titles (on by default) remember_position = 1 # Use borderless one-line high buttons small-button = true # Workspaces are created simply by adding Workspace-X groups as follows: [Workspace-1] name = blist # window-names specifies that windows with these semi-colon separated names are placed into this workspace window-names = buddylist;debug-window [Workspace-2] name = IM window-names = conversation-window # window-titles specifies that windows with these semi-colon separated titles are placed into this workspace. These are matched as substrings. Window titles take precedence over names. window-titles = Preferences;Pounce |
Casi todo está por defecto, exceptuando el tema de los workspaces, que en mi caso separo las “conversation-window” en el Workspace-2 del resto en el Workspace-1.
Y por qué usar este programa en vez de los super-bonitos clientes actuales, en mi caso como no me canso de repetir… ram:
1 | dodger 1266 0.0 1.0 65268 20684 pts/0 Ss+ Sep09 3:26 finch |
Por los +100MB de pidgin por ejemplo.
Otra cosa es que al final te acostumbras a los shortcuts de finch y como todo trabajador de la consola, no puedes estar sin ellos.
Como ejemplo, pongo algunos (los más usados):
| ####shortcut#### |
|
ALT+a |
List of avalaible actions |
ALT+n |
Next window |
ALT+p |
Prev window |
ALT+w |
window list |
ALT+c |
Close window |
ALT+q |
Quit |
ALT+m |
Move window |
ALT+r |
Resize window |
ALT+s |
window list |
ALT+. |
Move the position of the current window in the window list one place to the right. |
ALT+, |
Move the position of the current window in the window list one place to the left. |
ALT+l |
Refresh the windows. Useful after resizing the terminal window. |
ALT+1..0 |
Jump to the 1st, 2nd … 10th window. |
CRTL+o |
Bring up the menu (if there is one) for a window. |
ALT+> |
Switch to the next workspace |
ALT+< |
Switch to the previous workspace |
AvPag RePag |
Scroll text page up/page down |
In the buddy list->F11 |
Add buddy |
Completito, vaya… Más en el manual o en la docu oficial.

