Uso avanzado de la línea de comandos Octavio H. Ruiz Cervera Campus Party 2009 México, D.F.
Patrocinan
Resumen La familiarización así como la productividad del usuario en un ambiente *NIX, están intrínsecamente relacionados con el conocimiento y aprovechamiento de las características de la interfaz básica que le otorga el sistema: La shell. Entre las características principales de Bash -el intérprete de comandos predeterminado de los sistemas GNU- se encuentran el control de trabajos; auto-completar; las expansiones (aritméticas, de variables, etc.); el historial; la edición y reingreso de comandos; entre otras. Particularmente más allá de ser la capa entre usuario y núcleo del sistema operativo, así como de sus características en esta relación, Bash es un poderoso lenguaje de programación en el cual bajo el contexto de «lanzador de programas», prácticamente cualquier utilidad o herramienta del repertorio de comandos UNIX, puede ser invocada desde un programa de shell, facilitando tareas de administración del sistema y trabajos repetitivos de rutina. Esta presentación proveerá al asistente una guía fácil para aprovechar las principales características de Bash como lenguaje de programación y lanzador de programas en el uso diario de sistemas *NIX.
Introducción ¿Qué aprenderemos aquí?  Utilizar el intérprete de comandos Agilizar la introducción de comandos Automatizar tareas  Tips y trucos  Más tips y trucos ¿Qué no aprenderemos aquí? Uso de herramientas tipo Midnight Comadre
Bash ¿Qué es Bash? Acrónimo: Bourn Again Shell Intérprete de comandos  de facto Procesador de macros Lanzador de programas Lenguaje de programación «No hay lenguaje de programación perfecto. No hay ni si quiera un mejor lenguaje; solo hay lenguajes buenos o quizás malos para una tarea en particular.» Herbert Mayer Stephen Bourne fué el creador de la shell  sh
Bash Cuándo no deberíamos usar Bash como lenguaje: Operaciones demandantes de recursos Aritmética de punto flotante, números complejos Misión crítica Multiplataforma Operadores de archivos (serial, linea por linea) Soporte nativo de arreglos multidimensionales Estructuras de datos E/S Seguridad
Bash Fácil de aprender Pequeño conjunto de operadores y opciones Sintaxis simple y directa Documentación extensa y técnica Esencial para la administración de sistemas ¿Sólo para la administración de sistemas? Método rápido para el prototipo de aplicaciones Filosofía UNIX
Descriptores de archivos Tres descriptores básicos 0 Entrada Estándar 1 Salida Estándar  2 Error Estándar Crear (abrir), redirigir, añadir, duplicar, mover, cerrar Límite de 9 descriptores de archivos
Redirecciones y tuberías > >> < <<DELIMITADOR |  [email_address]   ~ $  comando > archivo [email_address]   ~ $  comando | comando [email_address]   ~ $  comando 2> archivo [email_address]   ~ $  comando 1> archivo 2>&1 [email_address]   ~ $  comando &> archivo [email_address]   ~ $  comando >> archivo [email_address]   ~ $  comando <<EOF > archivo .... EOF
No clobber set -o noclobber [email_address]   ~ $   set -o noclobber [email_address]   ~ $  ls > archivo archivo: ASCII text [email_address]   ~ $  ls > archivo -bash: archivo: cannot overwrite existing file [email_address]   ~ $  ls >| archivo
FIFO's Substitución de procesos Named Pipe First In, First Out (FIFO) tacvbo   ~ $  mkfifo ELFIFO tacvbo   ~ $  gzip -9 -c < ELFIFO > archivo.gzip tacvbo   ~ $  cat archivo > ELFIFO tacvbo   ~ $   tacvbo   ~ $   diff -u <(wget http://web/archivo1) \ <(ssh cuatrocaminos 'cat archivo2') --- /dev/fd/63  2005-09-29 16:02:41.117475250 -0500 +++ /dev/fd/62  2005-09-29 16:02:41.117475250 -0500 @@  ....
Expansiones Brace Generación arbitraria de cadenas tacvbo   ~ $   touch test-v{1,2,3} test-v1 test-v2 test-v3 tacvbo   ~ $   ls /usr/{,local/}{,s}bin/binario /usr/bin/file /usr/sbin/file /usr/local/bin/file /usr/local/sbin/file
Loops for for (( i=10; i>0; ++i)) for i in {1..10} for i in 1 2 3 4 5 6 7 8 9 10   while until ...
Variables de entorno Cadenas ASCII definidas por el usuario Son parte estándar del modelo de procesos UNIX Cualquier programa ejecutado tendrá acceso a ellas QUOTING: “” '' `` [email_address]   ~ $  VARIABLE=”hola a todos” [email_address]   ~ $  VARIABLE=”hola a todos” [email_address] valancha   ~ $  echo ${VARIABLE} hola a todos [email_address]   ~ $ [email_address]   ~ $  VARIABLE=”hola a todos” [email_address]   ~ $  echo ${VARIABLE} hola a todos [email_address]   ~ $  bash -c 'echo ${VARIABLE}' [email_address]   ~ $  [email_address]   ~ $  VARIABLE=”hola a todos” [email_address]   ~ $  echo ${VARIABLE} hola a todos [email_address]   ~ $  bash -c 'echo ${VARIABLE}' [email_address]   ~ $  export VARIABLE [email_address]   ~ $  [email_address]   ~ $  VARIABLE=”hola a todos” [email_address]   ~ $  echo ${VARIABLE} hola a todos [email_address]   ~ $  bash -c 'echo ${VARIABLE}' [email_address]   ~ $  export VARIABLE [email_address]   ~ $  !b [email_address]   ~ $  VARIABLE=”hola a todos” [email_address]   ~ $  echo ${VARIABLE} hola a todos [email_address]   ~ $  bash -c 'echo ${VARIABLE}' [email_address]   ~ $  export VARIABLE [email_address]   ~ $  bash -c 'echo ${VARIABLE}' hola a todos [email_address]   ~ $
Cortando cadenas Dividir una cadena en partes (chunks) basename dirname  [email_address]   ~ $  basename /usr/pakistan/bin/laden laden [email_address]   ~ $  dirname /usr/pakistan/bin/laden /usr/pakistan/bin [email_address]   ~ $ Esto es exclusivamente manipulación de cadenas
Substitución de comandos Substituye la salida de un comando $(comando) `comando` Esta substitución la podemos meter en una variable variable=$(comando) tacvbo   ~ $  MYFILE=$(basename /usr/pakistan/bin/laden) tacvbo   ~ $  echo ${MYFILE} laden tacvbo   ~ $  MYDIR=$(dirname /usr/pakistan/bin/laden) tacvbo   ~ $  echo ${MYDIR} /usr/pakistan/bin/laden
Expansión de parámetros $ Invoca a la expansión de parámetros ${VARIABLE} ${VARIABLE/patrón/cadena} ${VARIABLE:/desde (#)/cuantos (#)} ${VARIABLE##/*token} ${VARIABLE%/token*} ${VARIABLE:-token} ${VARIABLE:+token}
Expansión de parámetros [email_address]   ~ $  MYVAR=”hola a todos” [email_address]   ~ $  echo ${MYVAR} hola a todos [email_address]   ~ $  echo ${MYVAR/todos/tod@s} hola a tod@s [email_address]   ~ $  MYVAR=abcdefghijklmn [email_address]   ~ $  echo ${MYVAR} abcdefghijklmn [email_address]   ~ $  echo ${MYVAR:3} defghijklmn [email_address]   ~ $  echo ${MYVAR:3:3} def
Expansión de parámetros (Cortando Cadenas 2da parte) [email_address]   ~ $  MYVAR=superfestivalfeliz [email_address]   ~ $  echo ${MYVAR} superfestivalfeliz [email_address]   ~ $  echo ${MYVAR##*fe} liz [email_address]   ~ $  echo ${MYVAR#*fe} stivalfeliz [email_address]   ~ $  MYVAR=superfestivalfeliz [email_address]   ~ $  echo ${MYVAR} superfestivalfeliz [email_address]   ~ $  echo ${MYVAR%%fe*} super [email_address]   ~ $  echo ${MYVAR%fe*} superfestival
Expansión de parámetros (Cortando Cadenas 2da parte) superfestivalfeli z superfestivalfel iz superfestivalfe  liz  ## superfestivalf eliz superfestival  feliz   % superfestiva lfeliz superfestiv alfeliz superfesti valfeliz superfest ivalfeliz superfes tivalfeliz superfe  stivalfeliz  # superf estivalfeliz super  festivalfeliz   %% sup erfestivalfeliz su perfestivalfeliz s uperfestivalfeliz
Expansión de parámetros (Cortando Cadenas 2da parte) [email_address]   ~ $  MYDIR=”/usr/pakistan/bin/laden” [email_address]   ~ $  echo ${MYDIR} /usr/pakistan/bin/laden [email_address]   ~ $  basename ${MYDIR} laden [email_address]   ~ $  echo ${MYDIR##*/} laden [email_address]   ~ $  dirname ${MYDIR} /usr/pakistan/bin [email_address]   ~ $  echo ${MYDIR%/*} /usr/pakistan/bin [email_address]   ~ $  MYDIR=${MYDIR%/*}
Expansión de parámetros tacvbo   ~ $  VARIABLE=&quot;&quot; tacvbo   ~ $  echo $VARIABLE tacvbo   ~ $  echo ${VARIABLE:-Sin definir, SUBSTITUYO} Sin definir, SUBSTITUYO tacvbo   ~ $  echo ${VARIABLE:?Sin definir, ERROR} -bash: VARIABLE: Sin definir, ERROR tacvbo   ~ $  echo ${VARIABLE:+Sin definir, NO HAGO NADA} tacvbo   ~ $  echo ${VARIABLE:=Sin definir, SETEO y SUBSTITUYO} Sin definir, SETEO y SUBSTITUYO tacvbo   ~ $  echo ${VARIABLE} Sin definir, SETEO y SUBSTITUYO tacvbo   ~ $  echo ${VARIABLE:+Definida, SUBSTITUYO} Definida, SUBSTITUYO
shopt Cambia los valores de variables que controlan el comportamiento de la shell -s (define) -u (desactiva) -q (modo silencioso)
Coincidencia de patrones ?(pattern-list) cero o una ocurrencia *(pattern-list) cero o más ocurrencias +(pattern-list) una o más ocurrencias shopt -s extglob [email_address]   ~ $   shopt -e extglob [email_address]   ~ $   ls -lad !(*.mp?(eg|g)) uno.txt dos.pl tres.ext cuatro.sh [email_address]   ~ $   @(pattern-list) Patrón exacto !(pattern-list) Todo excepto patrón
Comandos compuestos ( comando ) { comando1 ; comando2; comando3 } (( expresión aritmética ))  [[  expresión condicional ]] ! && ||
Expansión aritmética $((  )) id++  ++id id--  --id + - ** * / [email_address]   ~ $   echo $(( 5 + 5 )) 10 [email_address]   ~ $   n=2; echo $(( ++n )) 3 [email_address]   ~ $
Control de tareas bg fg root   ~ $  updatedb ^Z [1]+  Stopped  updatedb root   ~ $  fg %1 updatedb  ^Z [1]+  Stopped  updatedb root   ~ $  bg %1 [1]+ updatedb & root   ~ $  jobs [1]+  Running  updatedb & root   ~ $  disown %1 [email_address]   ~ $  ps aux | grep updatedb root 1439 2.0 0.1  7140 1056 pts/2 R 04:43  0:02  updatedb jobs disown
Funciones Es un objeto que es llamado con un simple comando Se puede exportar a nuestro ambiente (export) Sobreescribir el comportamiento de un comando Crear nuevos comandos
Funciones Ejemplos: function duff() { diff -ur “$@” } export -f duff function gimp() { command gimp “$@” &>/dev/null & } export -f duff
Funciones :(){:|:&};: :() { :|:&  } : funcion() { funcion|funcion&  } funcion Démosle un vistazo a esto: Ahora identado... Substituyamos... ¡No es un BUG!
ulimit Provee control sobre los recursos disponibles -c máximo tamaño de core dumps -u máximo número de procesos al usuario -a muestra todos los limites [email_address]   ~ $  ulimit -a | grep processes max user  processes   (-u)  8191 [email_address]   ~ $  ulimit -u 128 [email_address]   ~ $  ulimit -a | grep processes max user  processes   (-u)  128 [email_address]   ~ $  :(){:|:&};: -bash: fork: Resource temporarily unavailable -bash: fork: Resource temporarily unavailable [email_address]   ~ $
Grep export GREP_COLOR=31 export GREP_OPTIONS=&quot;--colour=auto --binary-files=text&quot; [email_address]   ~ $  cat archivo blanco blanco blanco blanco blanco blanco blanco  rojo  blanco blanco blanco blanco blanco blanco blanco [email_address]   ~ $  grep rojo archivo blanco blanco  rojo  blanco blanco [email_address]   ~ $
Readline... a la emacs ^a ^e ^f ^b ^l M - m _ ^t M t M u M l ^u ^k ^y ^ d export IGNOREEOF=1
...O a la VI ...o usar los keybindings de VI Editemos nuestro ${HOME}/.inputrc set editing-mode vi set keymap vi  [email_address]   ~ $  set -o vi
Cambiando de directorio $CDPATH Variable del entorno Separada por “dos puntos” Añade a la lista del built-in `cd` Recordando donde hemos estado pushd popd dirs cd -, ~-
cdSpell Cuando escribimos incorrectamente el nombre de un directorio y no hay otra coincidencia, bash corregirá nuestro error. [email_address]   ~ $   shopt -s cdspell
No mas dobles «tabs» Cuando presionamos «tab», y una ambigüedad es encontrada, es necesario pulsar nuevamente «tab» Para evitar esto, y que solo un «tab» sea necesario: Editemos nuestro ${HOME}/.inputrc set show-all-if-ambiguous on
ls -F al autocompletar En una terminal sin color, un ls -F es muy útil y podemos integrar este formato al autocompletar.  Editemos nuestro ${HOME}/.inputrc set visible-stats on [email_address]   ~ $  ls -F archivo  directorio/   ejecutable*   fifo|   symlink@ [email_address]   ~ $  ls «tab» archivo  directorio   ejecutable   fifo   symlink [email_address]   ~ $  set visible-stats on [email_address]   ~ $  ls «tab» archivo  directorio/  ejecutable*  fifo|  symboliclink@ [email_address]   ~ $
Historial ¿Para qué nos sirve el historial? Para no volver a escribir algo ya escrito ¿En verdad? Solo en teoría Algunos comandos no son salvados No explotamos su funcionalidad UP y DOWN no es la manera mas eficiente UP, LEFT y Backspace tampoco lo es
Historial El problema de la «Nueva Terminal» [email_address]   ~ $   <up> rm -rf ${HOME}/tmp [email_address]   ~ $   history | wc -l 101 [email_address]   ~ $  <99 comandos después...> [email_address]   ~ $  history | wc -l 200 [email_address]   ~ $  ssh callampa.tacvbo.net Password: ******* [email_address]   ~ $   [email_address]   ~ $   <up> rm -rf ${HOME}/tmp [email_address]   ~ $   history | wc -l 101 [email_address]   ~ $
Historial El problema de la «Nueva Terminal» [email_address]   ~ $  ssh callampa.tacvbo.net Password: ******* [email_address]   ~ $  logout [email_address]   ~ $  history | wc -l 201 [email_address]   ~ $  logout [email_address]   ~ $   history | wc -l 101 [email_address]   ~ $  logout [email_address]   ~ $   <up> rm -rf ${HOME}/tmp [email_address]   ~ $   history | wc -l 101 [email_address]   ~ $
Historial Al salir nuestro historial se guarda en ${HISTFILE} Ambos problemas pueden ser solucionados añadiendo cada comando al historial en lugar de sobreescribirlo  Editemos nuestro ${HOME}/.bashrc Si ya esta definida ${PROMPT_COMMAND} será sobreescrita PROMPT_COMMAND=\ &quot;${PROMPT_COMMAND:+${PROMPT_COMMAND} ;} history -a&quot; shopt -s histappend export PROMPT_COMMAND=”history -a” Si nuestra shell esta configurada como «login shell» el archivo que será leído es: .bash_profile
Buscando el pasado Las formas MUY poco efectivas: Presionar <UP>  Volver a presionar <UP> Seguir presionando <UP> Las formas útiles, pero poco efectivas: Búsquedas incrementales con ^R y ^S Las formas rápidas, pero poco precisas: !comando
Buscando en el pasado Búsquedas no incrementales con <UP> y <DOWN> Editemos nuestro ${HOME}/.inputrc &quot;\e[A&quot;: history-search-backward &quot;\e[B&quot;: history-search-forward El antiguo comportamiento aun persiste en ^P y ^N previous-history y next-history respectivamente.
Historial (!!) Ultimo argumento !$ Todos los argumentos !* Substituciones ^patron^string Substituciones !:gs/patron/string Comando anterior ! N comandos anteriores !-n :h (dirname) :t (basename) :r
Historial Podemos saber que sucederá en nuestra substitución Usando el «espacio mágico» Usando histverify en nuestras opciones de shell :p no solo es una carita sacando la lengua
El espacio mágico El espacio mágico (magic-space) Editemos nuestro ${HOME}/.inputrc Space: magic-space
histverify histverify pondrá en el buffer de edición la substitución antes de que sea pasada a la shell Editemos nuestro ${HOME}/.bashrc shopt -s histverify
:P no es una carita Lo podemos usar en lugar de histverify No podemos editar la salida Añadamos :p al final de nuestra expresión [email_address]   ~ $   history | wc -l 101 [email_address]   ~ $  !h:p history | wc -l [email_address]   ~ $
¿Preguntas? ?
Contacto Octavio H. Ruiz (Ta^3) [email_address] http://www.tacvbo.net/ http://www.twitter.com/tacvbo
Layout

Bash Tips Tricks Campus

  • 1.
    Uso avanzado dela línea de comandos Octavio H. Ruiz Cervera Campus Party 2009 México, D.F.
  • 2.
  • 3.
    Resumen La familiarizaciónasí como la productividad del usuario en un ambiente *NIX, están intrínsecamente relacionados con el conocimiento y aprovechamiento de las características de la interfaz básica que le otorga el sistema: La shell. Entre las características principales de Bash -el intérprete de comandos predeterminado de los sistemas GNU- se encuentran el control de trabajos; auto-completar; las expansiones (aritméticas, de variables, etc.); el historial; la edición y reingreso de comandos; entre otras. Particularmente más allá de ser la capa entre usuario y núcleo del sistema operativo, así como de sus características en esta relación, Bash es un poderoso lenguaje de programación en el cual bajo el contexto de «lanzador de programas», prácticamente cualquier utilidad o herramienta del repertorio de comandos UNIX, puede ser invocada desde un programa de shell, facilitando tareas de administración del sistema y trabajos repetitivos de rutina. Esta presentación proveerá al asistente una guía fácil para aprovechar las principales características de Bash como lenguaje de programación y lanzador de programas en el uso diario de sistemas *NIX.
  • 4.
    Introducción ¿Qué aprenderemosaquí? Utilizar el intérprete de comandos Agilizar la introducción de comandos Automatizar tareas Tips y trucos Más tips y trucos ¿Qué no aprenderemos aquí? Uso de herramientas tipo Midnight Comadre
  • 5.
    Bash ¿Qué esBash? Acrónimo: Bourn Again Shell Intérprete de comandos de facto Procesador de macros Lanzador de programas Lenguaje de programación «No hay lenguaje de programación perfecto. No hay ni si quiera un mejor lenguaje; solo hay lenguajes buenos o quizás malos para una tarea en particular.» Herbert Mayer Stephen Bourne fué el creador de la shell sh
  • 6.
    Bash Cuándo nodeberíamos usar Bash como lenguaje: Operaciones demandantes de recursos Aritmética de punto flotante, números complejos Misión crítica Multiplataforma Operadores de archivos (serial, linea por linea) Soporte nativo de arreglos multidimensionales Estructuras de datos E/S Seguridad
  • 7.
    Bash Fácil deaprender Pequeño conjunto de operadores y opciones Sintaxis simple y directa Documentación extensa y técnica Esencial para la administración de sistemas ¿Sólo para la administración de sistemas? Método rápido para el prototipo de aplicaciones Filosofía UNIX
  • 8.
    Descriptores de archivosTres descriptores básicos 0 Entrada Estándar 1 Salida Estándar 2 Error Estándar Crear (abrir), redirigir, añadir, duplicar, mover, cerrar Límite de 9 descriptores de archivos
  • 9.
    Redirecciones y tuberías> >> < <<DELIMITADOR | [email_address] ~ $ comando > archivo [email_address] ~ $ comando | comando [email_address] ~ $ comando 2> archivo [email_address] ~ $ comando 1> archivo 2>&1 [email_address] ~ $ comando &> archivo [email_address] ~ $ comando >> archivo [email_address] ~ $ comando <<EOF > archivo .... EOF
  • 10.
    No clobber set-o noclobber [email_address] ~ $ set -o noclobber [email_address] ~ $ ls > archivo archivo: ASCII text [email_address] ~ $ ls > archivo -bash: archivo: cannot overwrite existing file [email_address] ~ $ ls >| archivo
  • 11.
    FIFO's Substitución deprocesos Named Pipe First In, First Out (FIFO) tacvbo ~ $ mkfifo ELFIFO tacvbo ~ $ gzip -9 -c < ELFIFO > archivo.gzip tacvbo ~ $ cat archivo > ELFIFO tacvbo ~ $ tacvbo ~ $ diff -u <(wget http://web/archivo1) \ <(ssh cuatrocaminos 'cat archivo2') --- /dev/fd/63 2005-09-29 16:02:41.117475250 -0500 +++ /dev/fd/62 2005-09-29 16:02:41.117475250 -0500 @@ ....
  • 12.
    Expansiones Brace Generaciónarbitraria de cadenas tacvbo ~ $ touch test-v{1,2,3} test-v1 test-v2 test-v3 tacvbo ~ $ ls /usr/{,local/}{,s}bin/binario /usr/bin/file /usr/sbin/file /usr/local/bin/file /usr/local/sbin/file
  • 13.
    Loops for for(( i=10; i>0; ++i)) for i in {1..10} for i in 1 2 3 4 5 6 7 8 9 10 while until ...
  • 14.
    Variables de entornoCadenas ASCII definidas por el usuario Son parte estándar del modelo de procesos UNIX Cualquier programa ejecutado tendrá acceso a ellas QUOTING: “” '' `` [email_address] ~ $ VARIABLE=”hola a todos” [email_address] ~ $ VARIABLE=”hola a todos” [email_address] valancha ~ $ echo ${VARIABLE} hola a todos [email_address] ~ $ [email_address] ~ $ VARIABLE=”hola a todos” [email_address] ~ $ echo ${VARIABLE} hola a todos [email_address] ~ $ bash -c 'echo ${VARIABLE}' [email_address] ~ $ [email_address] ~ $ VARIABLE=”hola a todos” [email_address] ~ $ echo ${VARIABLE} hola a todos [email_address] ~ $ bash -c 'echo ${VARIABLE}' [email_address] ~ $ export VARIABLE [email_address] ~ $ [email_address] ~ $ VARIABLE=”hola a todos” [email_address] ~ $ echo ${VARIABLE} hola a todos [email_address] ~ $ bash -c 'echo ${VARIABLE}' [email_address] ~ $ export VARIABLE [email_address] ~ $ !b [email_address] ~ $ VARIABLE=”hola a todos” [email_address] ~ $ echo ${VARIABLE} hola a todos [email_address] ~ $ bash -c 'echo ${VARIABLE}' [email_address] ~ $ export VARIABLE [email_address] ~ $ bash -c 'echo ${VARIABLE}' hola a todos [email_address] ~ $
  • 15.
    Cortando cadenas Dividiruna cadena en partes (chunks) basename dirname [email_address] ~ $ basename /usr/pakistan/bin/laden laden [email_address] ~ $ dirname /usr/pakistan/bin/laden /usr/pakistan/bin [email_address] ~ $ Esto es exclusivamente manipulación de cadenas
  • 16.
    Substitución de comandosSubstituye la salida de un comando $(comando) `comando` Esta substitución la podemos meter en una variable variable=$(comando) tacvbo ~ $ MYFILE=$(basename /usr/pakistan/bin/laden) tacvbo ~ $ echo ${MYFILE} laden tacvbo ~ $ MYDIR=$(dirname /usr/pakistan/bin/laden) tacvbo ~ $ echo ${MYDIR} /usr/pakistan/bin/laden
  • 17.
    Expansión de parámetros$ Invoca a la expansión de parámetros ${VARIABLE} ${VARIABLE/patrón/cadena} ${VARIABLE:/desde (#)/cuantos (#)} ${VARIABLE##/*token} ${VARIABLE%/token*} ${VARIABLE:-token} ${VARIABLE:+token}
  • 18.
    Expansión de parámetros[email_address] ~ $ MYVAR=”hola a todos” [email_address] ~ $ echo ${MYVAR} hola a todos [email_address] ~ $ echo ${MYVAR/todos/tod@s} hola a tod@s [email_address] ~ $ MYVAR=abcdefghijklmn [email_address] ~ $ echo ${MYVAR} abcdefghijklmn [email_address] ~ $ echo ${MYVAR:3} defghijklmn [email_address] ~ $ echo ${MYVAR:3:3} def
  • 19.
    Expansión de parámetros(Cortando Cadenas 2da parte) [email_address] ~ $ MYVAR=superfestivalfeliz [email_address] ~ $ echo ${MYVAR} superfestivalfeliz [email_address] ~ $ echo ${MYVAR##*fe} liz [email_address] ~ $ echo ${MYVAR#*fe} stivalfeliz [email_address] ~ $ MYVAR=superfestivalfeliz [email_address] ~ $ echo ${MYVAR} superfestivalfeliz [email_address] ~ $ echo ${MYVAR%%fe*} super [email_address] ~ $ echo ${MYVAR%fe*} superfestival
  • 20.
    Expansión de parámetros(Cortando Cadenas 2da parte) superfestivalfeli z superfestivalfel iz superfestivalfe liz ## superfestivalf eliz superfestival feliz % superfestiva lfeliz superfestiv alfeliz superfesti valfeliz superfest ivalfeliz superfes tivalfeliz superfe stivalfeliz # superf estivalfeliz super festivalfeliz %% sup erfestivalfeliz su perfestivalfeliz s uperfestivalfeliz
  • 21.
    Expansión de parámetros(Cortando Cadenas 2da parte) [email_address] ~ $ MYDIR=”/usr/pakistan/bin/laden” [email_address] ~ $ echo ${MYDIR} /usr/pakistan/bin/laden [email_address] ~ $ basename ${MYDIR} laden [email_address] ~ $ echo ${MYDIR##*/} laden [email_address] ~ $ dirname ${MYDIR} /usr/pakistan/bin [email_address] ~ $ echo ${MYDIR%/*} /usr/pakistan/bin [email_address] ~ $ MYDIR=${MYDIR%/*}
  • 22.
    Expansión de parámetrostacvbo ~ $ VARIABLE=&quot;&quot; tacvbo ~ $ echo $VARIABLE tacvbo ~ $ echo ${VARIABLE:-Sin definir, SUBSTITUYO} Sin definir, SUBSTITUYO tacvbo ~ $ echo ${VARIABLE:?Sin definir, ERROR} -bash: VARIABLE: Sin definir, ERROR tacvbo ~ $ echo ${VARIABLE:+Sin definir, NO HAGO NADA} tacvbo ~ $ echo ${VARIABLE:=Sin definir, SETEO y SUBSTITUYO} Sin definir, SETEO y SUBSTITUYO tacvbo ~ $ echo ${VARIABLE} Sin definir, SETEO y SUBSTITUYO tacvbo ~ $ echo ${VARIABLE:+Definida, SUBSTITUYO} Definida, SUBSTITUYO
  • 23.
    shopt Cambia losvalores de variables que controlan el comportamiento de la shell -s (define) -u (desactiva) -q (modo silencioso)
  • 24.
    Coincidencia de patrones?(pattern-list) cero o una ocurrencia *(pattern-list) cero o más ocurrencias +(pattern-list) una o más ocurrencias shopt -s extglob [email_address] ~ $ shopt -e extglob [email_address] ~ $ ls -lad !(*.mp?(eg|g)) uno.txt dos.pl tres.ext cuatro.sh [email_address] ~ $ @(pattern-list) Patrón exacto !(pattern-list) Todo excepto patrón
  • 25.
    Comandos compuestos (comando ) { comando1 ; comando2; comando3 } (( expresión aritmética )) [[ expresión condicional ]] ! && ||
  • 26.
    Expansión aritmética $(( )) id++ ++id id-- --id + - ** * / [email_address] ~ $ echo $(( 5 + 5 )) 10 [email_address] ~ $ n=2; echo $(( ++n )) 3 [email_address] ~ $
  • 27.
    Control de tareasbg fg root ~ $ updatedb ^Z [1]+ Stopped updatedb root ~ $ fg %1 updatedb ^Z [1]+ Stopped updatedb root ~ $ bg %1 [1]+ updatedb & root ~ $ jobs [1]+ Running updatedb & root ~ $ disown %1 [email_address] ~ $ ps aux | grep updatedb root 1439 2.0 0.1 7140 1056 pts/2 R 04:43 0:02 updatedb jobs disown
  • 28.
    Funciones Es unobjeto que es llamado con un simple comando Se puede exportar a nuestro ambiente (export) Sobreescribir el comportamiento de un comando Crear nuevos comandos
  • 29.
    Funciones Ejemplos: functionduff() { diff -ur “$@” } export -f duff function gimp() { command gimp “$@” &>/dev/null & } export -f duff
  • 30.
    Funciones :(){:|:&};: :(){ :|:& } : funcion() { funcion|funcion& } funcion Démosle un vistazo a esto: Ahora identado... Substituyamos... ¡No es un BUG!
  • 31.
    ulimit Provee controlsobre los recursos disponibles -c máximo tamaño de core dumps -u máximo número de procesos al usuario -a muestra todos los limites [email_address] ~ $ ulimit -a | grep processes max user processes (-u) 8191 [email_address] ~ $ ulimit -u 128 [email_address] ~ $ ulimit -a | grep processes max user processes (-u) 128 [email_address] ~ $ :(){:|:&};: -bash: fork: Resource temporarily unavailable -bash: fork: Resource temporarily unavailable [email_address] ~ $
  • 32.
    Grep export GREP_COLOR=31export GREP_OPTIONS=&quot;--colour=auto --binary-files=text&quot; [email_address] ~ $ cat archivo blanco blanco blanco blanco blanco blanco blanco rojo blanco blanco blanco blanco blanco blanco blanco [email_address] ~ $ grep rojo archivo blanco blanco rojo blanco blanco [email_address] ~ $
  • 33.
    Readline... a laemacs ^a ^e ^f ^b ^l M - m _ ^t M t M u M l ^u ^k ^y ^ d export IGNOREEOF=1
  • 34.
    ...O a laVI ...o usar los keybindings de VI Editemos nuestro ${HOME}/.inputrc set editing-mode vi set keymap vi [email_address] ~ $ set -o vi
  • 35.
    Cambiando de directorio$CDPATH Variable del entorno Separada por “dos puntos” Añade a la lista del built-in `cd` Recordando donde hemos estado pushd popd dirs cd -, ~-
  • 36.
    cdSpell Cuando escribimosincorrectamente el nombre de un directorio y no hay otra coincidencia, bash corregirá nuestro error. [email_address] ~ $ shopt -s cdspell
  • 37.
    No mas dobles«tabs» Cuando presionamos «tab», y una ambigüedad es encontrada, es necesario pulsar nuevamente «tab» Para evitar esto, y que solo un «tab» sea necesario: Editemos nuestro ${HOME}/.inputrc set show-all-if-ambiguous on
  • 38.
    ls -F alautocompletar En una terminal sin color, un ls -F es muy útil y podemos integrar este formato al autocompletar. Editemos nuestro ${HOME}/.inputrc set visible-stats on [email_address] ~ $ ls -F archivo directorio/ ejecutable* fifo| symlink@ [email_address] ~ $ ls «tab» archivo directorio ejecutable fifo symlink [email_address] ~ $ set visible-stats on [email_address] ~ $ ls «tab» archivo directorio/ ejecutable* fifo| symboliclink@ [email_address] ~ $
  • 39.
    Historial ¿Para quénos sirve el historial? Para no volver a escribir algo ya escrito ¿En verdad? Solo en teoría Algunos comandos no son salvados No explotamos su funcionalidad UP y DOWN no es la manera mas eficiente UP, LEFT y Backspace tampoco lo es
  • 40.
    Historial El problemade la «Nueva Terminal» [email_address] ~ $ <up> rm -rf ${HOME}/tmp [email_address] ~ $ history | wc -l 101 [email_address] ~ $ <99 comandos después...> [email_address] ~ $ history | wc -l 200 [email_address] ~ $ ssh callampa.tacvbo.net Password: ******* [email_address] ~ $ [email_address] ~ $ <up> rm -rf ${HOME}/tmp [email_address] ~ $ history | wc -l 101 [email_address] ~ $
  • 41.
    Historial El problemade la «Nueva Terminal» [email_address] ~ $ ssh callampa.tacvbo.net Password: ******* [email_address] ~ $ logout [email_address] ~ $ history | wc -l 201 [email_address] ~ $ logout [email_address] ~ $ history | wc -l 101 [email_address] ~ $ logout [email_address] ~ $ <up> rm -rf ${HOME}/tmp [email_address] ~ $ history | wc -l 101 [email_address] ~ $
  • 42.
    Historial Al salirnuestro historial se guarda en ${HISTFILE} Ambos problemas pueden ser solucionados añadiendo cada comando al historial en lugar de sobreescribirlo Editemos nuestro ${HOME}/.bashrc Si ya esta definida ${PROMPT_COMMAND} será sobreescrita PROMPT_COMMAND=\ &quot;${PROMPT_COMMAND:+${PROMPT_COMMAND} ;} history -a&quot; shopt -s histappend export PROMPT_COMMAND=”history -a” Si nuestra shell esta configurada como «login shell» el archivo que será leído es: .bash_profile
  • 43.
    Buscando el pasadoLas formas MUY poco efectivas: Presionar <UP> Volver a presionar <UP> Seguir presionando <UP> Las formas útiles, pero poco efectivas: Búsquedas incrementales con ^R y ^S Las formas rápidas, pero poco precisas: !comando
  • 44.
    Buscando en elpasado Búsquedas no incrementales con <UP> y <DOWN> Editemos nuestro ${HOME}/.inputrc &quot;\e[A&quot;: history-search-backward &quot;\e[B&quot;: history-search-forward El antiguo comportamiento aun persiste en ^P y ^N previous-history y next-history respectivamente.
  • 45.
    Historial (!!) Ultimoargumento !$ Todos los argumentos !* Substituciones ^patron^string Substituciones !:gs/patron/string Comando anterior ! N comandos anteriores !-n :h (dirname) :t (basename) :r
  • 46.
    Historial Podemos saberque sucederá en nuestra substitución Usando el «espacio mágico» Usando histverify en nuestras opciones de shell :p no solo es una carita sacando la lengua
  • 47.
    El espacio mágicoEl espacio mágico (magic-space) Editemos nuestro ${HOME}/.inputrc Space: magic-space
  • 48.
    histverify histverify pondráen el buffer de edición la substitución antes de que sea pasada a la shell Editemos nuestro ${HOME}/.bashrc shopt -s histverify
  • 49.
    :P no esuna carita Lo podemos usar en lugar de histverify No podemos editar la salida Añadamos :p al final de nuestra expresión [email_address] ~ $ history | wc -l 101 [email_address] ~ $ !h:p history | wc -l [email_address] ~ $
  • 50.
  • 51.
    Contacto Octavio H.Ruiz (Ta^3) [email_address] http://www.tacvbo.net/ http://www.twitter.com/tacvbo
  • 52.

Notas del editor

  • #6 macro processor means functionality where text and symbols are expanded to create larger expressions.