{"id":330,"date":"2023-09-01T10:02:44","date_gmt":"2023-09-01T08:02:44","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=330"},"modified":"2025-03-07T18:01:08","modified_gmt":"2025-03-07T16:01:08","slug":"1-15-diseno-de-protocolos-automaticos-en-el-terminal","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/1-15-diseno-de-protocolos-automaticos-en-el-terminal\/","title":{"rendered":"1.15. Dise\u00f1o de protocolos autom\u00e1ticos en el terminal"},"content":{"rendered":"<p>En este apartado os vais a introducir en el dise\u00f1o de protocolos autom\u00e1ticos en un terminal <em>bash<\/em>. Dentro del campo de la bioinform\u00e1tica aprender a dise\u00f1ar protocolos es \u00fatil por varias razones. En primer lugar, permite la automatizaci\u00f3n de tareas repetitivas, lo que ahorra tiempo y reduce el riesgo de errores. En segundo lugar, permite la creaci\u00f3n de flujos de trabajo reproducibles, que son esenciales para la investigaci\u00f3n cient\u00edfica. En tercer lugar, <em>bash<\/em> es una herramienta poderosa y flexible que se puede utilizar para manipular conjuntos de datos grandes y realizar an\u00e1lisis complejos. Finalmente, el uso de protocolos (en ingl\u00e9s, <em>script<\/em>) <em>bash<\/em> facilita la colaboraci\u00f3n y el intercambio de protocolos, lo que hace que sea m\u00e1s f\u00e1cil para los investigadores reproducir el trabajo de otros y construir sobre \u00e9l. En general, el dise\u00f1o de protocolos autom\u00e1ticos en un terminal <em>bash<\/em> es una forma eficiente y efectiva de realizar an\u00e1lisis de bioinform\u00e1tica.<\/p>\n<p>Al dise\u00f1ar un protocolo en un terminal <em>bash<\/em>, hay varios aspectos t\u00e9cnicos y par\u00e1metros que deben tenerse en cuenta. Aqu\u00ed se presentan los aspectos m\u00e1s importantes que hay que considerar.<\/p>\n<ul>\n<li><strong>Sintaxis y gram\u00e1tica<\/strong>: el protocolo debe tener una sintaxis y una gram\u00e1tica bien definidas que sean f\u00e1ciles de entender y seguir.<\/li>\n<li><strong>Manejo de errores<\/strong>: el protocolo debe estar dise\u00f1ado para manejar errores y excepciones de manera elegante. Esto incluye la definici\u00f3n de c\u00f3digos de error y mensajes.<\/li>\n<li><strong>Seguridad<\/strong>: el protocolo debe estar dise\u00f1ado para garantizar la privacidad y seguridad de los datos. Esto incluye medidas como la encriptaci\u00f3n, la autenticaci\u00f3n y el control de acceso.<\/li>\n<li><strong>Compatibilidad<\/strong>: el protocolo debe ser compatible con el <em>hardware<\/em> y el software del sistema en el que se utilizar\u00e1.<\/li>\n<li><strong>Eficiencia<\/strong>: el protocolo debe estar dise\u00f1ado para ser eficiente y optimizar el uso de los recursos del sistema, como la CPU y la memoria.<\/li>\n<li><strong>Escalabilidad<\/strong>: el protocolo debe estar dise\u00f1ado para ser escalable, de modo que pueda manejar cantidades crecientes de datos y usuarios sin degradaci\u00f3n del rendimiento.<\/li>\n<li><strong>Documentaci\u00f3n<\/strong>: el protocolo debe estar bien documentado, con instrucciones claras y ejemplos para su implementaci\u00f3n y uso.<\/li>\n<li><strong>Pruebas<\/strong>: el protocolo debe ser probado exhaustivamente para asegurar que su funcionalidad y rendimiento cumplan con los requisitos.<\/li>\n<\/ul>\n<p>Teniendo en cuenta estos aspectos t\u00e9cnicos y par\u00e1metros, el protocolo puede ser dise\u00f1ado para ser efectivo, seguro y eficiente en su funcionamiento. En este apartado se os muestra c\u00f3mo dise\u00f1ar protocolos sencillos, y no se tendr\u00e1 en cuenta todo lo mencionado anteriormente, pero siempre se debe trabajar teniendo en cuenta todas las consideraciones mencionadas.<\/p>\n<p>En este ejercicio se os va a mostrar c\u00f3mo generar un protocolo para obtener informaci\u00f3n biol\u00f3gica relevante a partir de 3 secuencias FASTA. Te animo a que realices todos los pasos que se muestran a continuaci\u00f3n. Abre un terminal y empieza.<\/p>\n<p>1) Crea un directorio:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ mkdir fasta_sequence<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cd fasta_sequence<\/pre>\n<p>2) Descarga, en el anterior directorio, y desde la base de datos ENA (<em>European Nucleotide Archive<\/em>) las secuencias FASTA asociadas a los genes humanos de BRCA1, BRCA2 y HOXB13:<\/p>\n<ul>\n<li>Uniprot ID: P38398, ENA accesion number: AC060780<br \/>\n<a href=\"https:\/\/www.ebi.ac.uk\/ena\/browser\/view\/AC060780\" target=\"_blank\" rel=\"noopener\">https:\/\/www.ebi.ac.uk\/ena\/browser\/view\/AC060780<\/a><\/li>\n<li>Uniprot ID: P51587, ENA accesion number: AL137247<br \/>\n<a href=\"https:\/\/www.ebi.ac.uk\/ena\/browser\/view\/AL137247\" target=\"_blank\" rel=\"noopener\">https:\/\/www.ebi.ac.uk\/ena\/browser\/view\/AL137247<\/a><\/li>\n<li>Uniprot ID: Q92826, ENA accesion number: BC007092<br \/>\n<a href=\"https:\/\/www.ebi.ac.uk\/ena\/browser\/view\/BC007092\" target=\"_blank\" rel=\"noopener\">https:\/\/www.ebi.ac.uk\/ena\/browser\/view\/BC007092<\/a><\/li>\n<\/ul>\n<p>3) Cuando se quiere ejecutar una serie de comandos de forma secuencial en el terminal <em>bash<\/em>, se crea un <em>script<\/em> o protocolo y se guarda en un archivo de texto con extensi\u00f3n \u00ab<code>.sh<\/code>\u00bb. Este <em>script<\/em> nos permite referirnos internamente a sus par\u00e1metros de manera gen\u00e9rica, lo que significa que puede funcionar en cualquier grupo de argumentos del mismo tipo. Adem\u00e1s, para hacerlo m\u00e1s flexible, se deben especificar estos par\u00e1metros gen\u00e9ricos dentro del <em>script<\/em>, de manera que cuando se invoque el <em>script<\/em> desde la l\u00ednea de comandos, podemos sustituir estos par\u00e1metros gen\u00e9ricos por valores espec\u00edficos proporcionados por el usuario junto con el nombre del comando. Al utilizar este enfoque, se pueden automatizar tareas repetitivas o procesos complejos, lo que hace que el trabajo sea m\u00e1s eficiente y consistente.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ vi analiza_fasta.sh<\/pre>\n<p>4) Antes de introducir el c\u00f3digo para generar un protocolo, dos consideraciones a tener en cuenta:<\/p>\n<ul>\n<li>En la primera l\u00ednea del protocolo se ha de indicar, siempre, el int\u00e9rprete de comandos <code>bash<\/code> (GNU Bourne-Again SHell). En la mayor\u00eda de los sistemas coexisten otros int\u00e9rpretes como <code>sh<\/code> (Bourne) o <code>csh<\/code> (C shell). El directorio donde se localiza el int\u00e9rprete se escribe a continuaci\u00f3n del conjunto de s\u00edmbolos<code>#!<\/code><\/li>\n<li>Para introducir comentarios en el protocolo se ha de introducir el s\u00edmbolo<code>#<\/code> (en ingl\u00e9s, <em>shebang<\/em>) en la primera columna del fichero.<\/li>\n<\/ul>\n<p>5) Escribe cada una de las siguientes l\u00edneas en el fichero <em>sh<\/em> que acabas de abrir. Debes escribir en modo <em>insert<\/em>, lo primero que tienes que hacer es teclear la letra <em><code>i<\/code><\/em>, y a continuaci\u00f3n escribe las siguientes l\u00edneas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">#!\/bin\/bash<\/pre>\n<p># Este protocolo analiza un fichero que contiene una \u00fanica secuencia FASTA<\/p>\n<p># Primero, se chequea si se suministra el nombre del fichero como argumento<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">if [ $# -eq 0 ]\r\n\r\nthen\r\n\r\n\u00a0\u00a0\u00a0 echo \"Por favor, suministra un nombre de fichero como argumento\"\r\n\r\n\u00a0\u00a0\u00a0 exit 1\r\n\r\nfi<\/pre>\n<p># El s\u00edmbolo $$ indica el PID del proceso<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"El valor del PID del proceso es\";\r\n\r\necho \"PID es $$\";<\/pre>\n<p># $1 representa el primer argumento a analizar. En este caso el nombre del fichero FASTA<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"El tama\u00f1o del fichero FASTA es:\";\r\n\r\nls -sh $1 | gawk '{print $1}';\r\n\r\necho \"N\u00famero de l\u00edneas del fichero FASTA:\";\r\n\r\nwc -l $1 | gawk '{ print $1 }';\r\n\r\necho \"Extrae las primeras siete l\u00edneas del fichero\";\r\n\r\nhead -7 $1;<\/pre>\n<p># Las siguientes dos l\u00edneas considera comentarlas, si la secuencia FASTA tiene muchas l\u00edneas<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"Extrae la secuencia del fichero FASTA\";\r\n\r\nsequence=$(awk '\/^&gt;\/ {next} {printf \"%s\", $0} END {print \"\"}' \"$1\")\r\n\r\necho \"$sequence\"<\/pre>\n<p># C\u00e1lculo de la longitud de la secuencia<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">length=$(echo -n \"$sequence\" | wc -c)\r\n\r\necho \" Longitud de la secuencia: $length nucleotidos\"<\/pre>\n<p># Cuenta el n\u00famero de nucle\u00f3tidos que tiene la secuencia<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">num_A=$(grep -o 'A' &lt;&lt;&lt; \"$sequence\" | wc -l)\r\n\r\nnum_C=$(grep -o 'C' &lt;&lt;&lt; \"$sequence\" | wc -l)\r\n\r\nnum_G=$(grep -o 'G' &lt;&lt;&lt; \"$sequence\" | wc -l)\r\n\r\nnum_T=$(grep -o 'T' &lt;&lt;&lt; \"$sequence\" | wc -l)\r\n\r\n<\/pre>\n<p># Se han generado <em>in situ<\/em> 4 nuevas variables. Imprime cada n\u00famero de nucle\u00f3tidos<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"Numero de nuclotido A: $num_A\"\r\n\r\necho \"Numero de nuclotido C: $num_C\"\r\n\r\necho \"Numero de nuclotido G: $num_G\"\r\n\r\necho \"Numero de nuclotido T: $num_T\"<\/pre>\n<p># C\u00e1lculo del contenido GC de la secuencia<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">num_GC=$((num_C + num_G))\r\n\r\ntotal=$((num_A + num_C + num_G + num_T))\r\n\r\ngc_content=$(bc -l &lt;&lt;&lt; \"scale=2; $num_GC \/ $total * 100\")\r\n\r\necho \"GC contenido: $gc_content%\"\r\n\r\n<\/pre>\n<p># Identificaci\u00f3n de los ORFs de la secuencia<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"Identificando ORFs...\"\r\n\r\nORFs=$(echo -n \"$sequence\" | tr 'ATCG' 'tacg' | grep -Eo '(atg([acgt]{3})*?(taa|tag|tga))+' | tr 'tacg' 'ATCG')\r\n\r\n\r\n\r\nif [ -z \"$ORFs\" ]\r\n\r\nthen\r\n\r\n\u00a0\u00a0\u00a0 echo \"No se encuentran ORFs\"\r\n\r\nelse\r\n\r\n\u00a0\u00a0\u00a0 num_ORFs=$(echo -n \"$ORFs\" | awk '{print length}' | wc -l)\r\n\r\n\u00a0\u00a0\u00a0 echo \"Numero de ORFs: $num_ORFs\"\r\n\r\n\u00a0\u00a0\u00a0 echo \"ORFs: $ORFs\"\r\n\r\nfi<\/pre>\n<p>Salva el fichero que se ha creado escribiendo :<code>wq! analiza_fasta.sh<\/code><\/p>\n<p>6) Para ejecutar el <em>script<\/em>, salva el anterior fichero con la extensi\u00f3n <code>\".sh\"<\/code>\u00a0y hazlo ejecutable con el comando <code>chmod +x<\/code>. Ejec\u00fatalo con el nombre del fichero FASTA a analizar:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ pwd<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/home\/student\/fasta_sequence<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\"> $ chmod +x analiza_fasta.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ .\/analiza_fasta.sh AC060780.18.fasta<\/pre>\n<p>7) Hasta ahora se ha generado un protocolo para analizar ficheros FASTA, se ha ejecutado y comprobado que funciona. El siguiente paso es ejecutar el anterior fichero de an\u00e1lisis en un directorio con diferentes secuencias. Para ello, se genera otro protocolo que incluya el anterior. El nuevo protocolo se llama <code>analiza_fasta_dir.sh<\/code>. Los pasos para seguir son:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ pwd<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/home\/student<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ vi analiza_fasta_dir.sh<\/pre>\n<p>Las \u00f3rdenes que hay que introducir en este fichero son:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">#! \/bin\/bash\r\n\r\necho \"Se inicia la ejecuci\u00f3n con el PID $$\";\r\n\r\necho \"N\u00famero de argumentos a analizar $#\";\r\n\r\necho \"El nombre del directorio a analizar $1\";\r\n\r\necho \"Los nombres de los ficheros que se analizan son\";\r\n\r\nls $1;\r\n\r\necho \"Ejecuci\u00f3n del protocolo de an\u00e1lisis FASTA para cada uno de los ficheros en el directorio\";\r\n\r\nls $1 | \u00a0\u00a0 while read file;\r\n\r\n\u00a0\u00a0\u00a0\u00a0 do\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echo \"ejecuci\u00f3n analiza_fasta.sh $file\";\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .\/analiza_fasta.sh $1\/$file;\r\n\r\n\u00a0\u00a0\u00a0\u00a0 done<\/pre>\n<p>Salva el fichero que se ha creado escribiendo :<code>wq! analiza_fasta_dir.sh<\/code><\/p>\n<p>8) Para ejecutar el <em>script<\/em>, salva el anterior fichero con la extensi\u00f3n<code>.sh<\/code> y hazlo ejecutable con el comando <code>chmod +x<\/code> . Ejec\u00fatalo con el nombre del directorio que contiene los ficheros FASTA a analizar:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ pwd<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/home\/student<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cp fasta_sequence\/analiza_fasta.sh .<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ chmod +x analita_fasta_dir.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ .\/analiza_fasta_dir.sh fasta_sequence<\/pre>\n<p>Se puede observar que los protocolos que se ejecutan se encuentran en el directorio actual de trabajo (.\/) y se a\u00f1ade el anterior s\u00edmbolo en lugar de solo invocar su nombre. Sin embargo, una vez que se est\u00e1 seguro de que el <em>script<\/em> funciona correctamente, es m\u00e1s conveniente guardar toda nuestra colecci\u00f3n de protocolos en un solo directorio del sistema. De esta manera, no se han de mantener m\u00faltiples copias y se podr\u00e1n ejecutar desde cualquier lugar en nuestro \u00e1rbol de directorios.<\/p>\n<p>Las plataformas Gnu\/Linux tienen un conjunto de variables globales que contienen datos de car\u00e1cter general. Se resumen en la siguiente tabla, la tabla 16.<\/p>\n<div class=\"tabletitle\"><p>Tabla 16. Comandos para la ejecuci\u00f3n de <em>scripts<\/em>.<\/p>\n<\/div>\n<table width=\"603\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"113\"><strong>Comando<\/strong><\/td>\n<td width=\"490\"><strong>Descripci\u00f3n<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>set<\/code><\/td>\n<td width=\"490\">Establece valores que ser\u00e1n usados por los programas, aplicaci\u00f3n, <em>scripts<\/em><\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>echo<\/code><\/td>\n<td width=\"490\">Imprime lo que se le encarga que haga<\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>printenv<\/code><\/td>\n<td width=\"490\">Lista la lista completa de variables de entorno de tu versi\u00f3n Gnu\/Linux<\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>which<\/code><\/td>\n<td width=\"490\">Localiza los archivos ejecutables de una determinada aplicaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>export<\/code><\/td>\n<td width=\"490\">Crea\/modifica una variable del sistema<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Fuente: elaboraci\u00f3n propia.<\/p>\n<\/div>\n<p>El comando <code>set<\/code> en Gnu\/Linux muestra y establece variables de entorno para la sesi\u00f3n actual. Se utiliza para ver el valor de las variables de entorno del sistema y tambi\u00e9n para asignar valores a nuevas variables de entorno. El comando <code>echo<\/code>, por otro lado, se utiliza para mostrar mensajes de texto o el valor de las variables en la pantalla. Tambi\u00e9n se puede utilizar para escribir texto en archivos o para concatenar varios mensajes de texto.<\/p>\n<p>La ventaja de utilizar <em>echo<\/em> es que permite seleccionar y mostrar solo la informaci\u00f3n que se necesita, lo que hace que sea m\u00e1s f\u00e1cil de leer y entender. Por otro lado, la ventaja de utilizar <em>set<\/em> es que permite establecer y modificar variables de entorno, lo que puede ser \u00fatil al automatizar tareas y <em>scripts<\/em> en Gnu\/Linux.<\/p>\n<p>Abre un terminal de Gnu\/Linux. Puedes ver la lista completa de variables de entorno de tu versi\u00f3n de Gnu\/Linux utilizando el comando <code>printenv<\/code>.\u00a0Puedes tener una lista m\u00e1s manejable a\u00f1adiendo diferentes comandos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$printenv | less<\/pre>\n<p>Cada l\u00ednea contiene el nombre de la variable de entorno Gnu\/Linux seguido de\u00a0=\u00a0y del valor. Por ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">HOME=\/home\/student<\/pre>\n<p>Esto quiere decir que HOME es una variable de entorno de Gnu\/Linux que tiene el valor establecido como <em>directorio\u00a0\/home\/student<\/em>.<\/p>\n<p>Las variables de entorno suelen estar en may\u00fasculas, aunque tambi\u00e9n puedes crear variables de entorno en min\u00fasculas. La salida de\u00a0<code>printenv<\/code>\u00a0muestra todas las variables de entorno en may\u00fasculas. Una cosa importante para tener en cuenta es que las variables de entorno de Gnu\/Linux distinguen entre may\u00fasculas y min\u00fasculas. Si deseas ver el valor de una variable de entorno espec\u00edfica, puedes hacerlo considerando el nombre de esa variable como argumento del comando <code>printenv<\/code>. La cadena de caracteres completa se ver\u00eda as\u00ed en la l\u00ednea de comando:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ printenv HOME<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/home\/student<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ echo $USER<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">student<\/pre>\n<p>La sintaxis b\u00e1sica para crear una variable de entorno en Gnu\/Linux es la siguiente. Es f\u00e1cil lograrlo, solo se necesita especificar un nombre y un valor. Seguiremos la convenci\u00f3n de mantener todas las letras en may\u00fasculas para el nombre de la variable, y la estableceremos como una cadena simple.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$\u00a0HIB_VAR='BioInformatica\u00a0y\u00a0BioEstadistica!'<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$\u00a0export\u00a0HIB_VAR<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$\u00a0export\u00a0HIB_VAR='BioInformatica\u00a0y\u00a0BioEstadistica!'\u00a0\u00a0\u00a0\u00a0#en\u00a0una\u00a0\u00fanica\u00a0l\u00ednea<\/pre>\n<p>Se han usado comillas simples, ya que el valor de la variable contiene un espacio. Adem\u00e1s, se han utilizado comillas simples porque el signo de exclamaci\u00f3n es un car\u00e1cter especial en la <em>shell<\/em> <em>bash<\/em> que normalmente se expande al historial de <em>bash<\/em> si no se escapa o se coloca entre comillas simples. Ahora tenemos una variable de <em>shell<\/em>. Esta variable est\u00e1 disponible en nuestra sesi\u00f3n actual, pero no se transmite a los procesos secundarios.<\/p>\n<p>Se puede comprobar, buscando nuestra nueva variable dentro de la salida de <em>set<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ set | grep HIB_VAR<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">HIB_VAR='BioInformartica y BioEstadistica!'<\/pre>\n<p>Si la variable se ha definido correctamente, podr\u00e1s utilizarla en cualquier protocolo que ejecutes en la misma sesi\u00f3n del terminal. Por ejemplo, si creas un archivo de <em>script<\/em> en <em>bash<\/em> que requiere utilizar la variable <code>HIB_VAR<\/code>, simplemente puedes referirte a ella utilizando el s\u00edmbolo <code>$<\/code>. Por ejemplo, si tu archivo de <em>script<\/em> se llama <em><code>myscript.sh<\/code><\/em> y contiene el siguiente c\u00f3digo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">#! \/bin\/bash\r\n\r\necho \" El valor de HIB_VAR es: $HIB_VAR\"<\/pre>\n<p>Si se ejecuta el archivo de <em>script<\/em> en la misma sesi\u00f3n del terminal utilizando el comando <em>bash<\/em>,<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ chmod +x myscript.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ bash myscript.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">BioInformatica y Bioestadistica!<\/pre>\n<p>el archivo de <em>script<\/em> deber\u00eda imprimir el valor de la variable <code>HIB_VAR<\/code> que definiste previamente. Para revertir el valor de una variable se puede usar el comando <code>unset<\/code><em>.<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ echo $HIB_VAR<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">BioInformartica y BioEstadistica!<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ unset HIB_VAR<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ echo $HIB_VAR<\/pre>\n<p>Por otra parte, ten en cuenta que, si cierras la sesi\u00f3n del terminal y la vuelves a abrir, tendr\u00e1s que volver a definir la variable local utilizando el comando <code>export<\/code>. Para evitar esto, puedes agregar la definici\u00f3n de la variable HIB_VAR a tu archivo de inicio de <em>bash<\/em> (por ejemplo, <code>~\/.bashrc<\/code>), de modo que la variable est\u00e9 disponible cada vez que inicies una nueva sesi\u00f3n del terminal.<\/p>\n<p>El comando <code>which<\/code> es una herramienta que permite encontrar r\u00e1pidamente los archivos ejecutables de una determinada aplicaci\u00f3n y localiza los ficheros ejecutables mediante la variable de entorno PATH.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ which nano docker gawk<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/usr\/bin\/nano\r\n\r\n\/usr\/bin\/docker\r\n\r\n\/usr\/bin\/gawk<\/pre>\n<p>Finalmente, se define la variable PATH. El contenido de la variable PATH es una cadena que contiene <em>paths<\/em> de directorios separados por dos puntos, y estos son los directorios en los que el <em>shell<\/em> busca el comando que\u00a0el usuario escribe desde el teclado.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ echo $PATH<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin:\r\n\/usr\/games:\/usr\/local\/games:\/snap\/bin\r\n<\/pre>\n<p>La b\u00fasqueda no se realiza en el orden en el que est\u00e1n los directorios en la variable PATH.\u00a0Cuando se escribe un comando\u00a0el <em>shell<\/em> buscar\u00e1 primero\u00a0en<code>\u00a0\/usr\/local\/bin<\/code>, luego en\u00a0<code>\/usr\/bin<\/code>, a continuaci\u00f3n, en\u00a0<code>\/usr\/games<\/code>\u00a0y finalmente en\u00a0<code>\/snap\/bin<\/code>. Desde el momento en que el <em>shell<\/em> encuentra el comando, detiene la b\u00fasqueda y\u00a0ejecuta el comando encontrado. Podemos escribir un comando utilizando:<\/p>\n<ul>\n<li>Su nombre:<br \/>\nEl path absoluto (<em>\/bin\/cat \/etc\/passwd<\/em> ).<br \/>\nEl\u00a0path relativo\u00a0(utilizando \u00ab.\u00bb o \u00ab..\u00bb en general para los programas o <em>scripts<\/em> que no se encuentran en PATH).<br \/>\nSe puede a\u00f1adir un directorio a la variable PATH, a\u00f1adamos el directorio donde se encuentran todos los <em>scripts<\/em> que se generen.<\/li>\n<li>\u00danicamente para la sesi\u00f3n activa:<br \/>\nSi deseas a\u00f1adir, por ejemplo: <code>\/home\/student\/HIB_scripts<\/code> a la variable <code>PATH<\/code>, escribe en el <em>shell<\/em> lo siguiente seg\u00fan el caso.<br \/>\n# Para tener el directorio al final del PATH:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ export PATH=$PATH:\/home\/student\/HIB_scripts<\/pre>\n<p># Para tener el directorio\u00a0al inicio del PATH:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ export PATH=\/home\/student\/HIB_scripts\/:$PATH<\/pre>\n<p>Ahora puedes utilizar el\u00a0programa escribiendo simplemente\u00a0su nombre. Al desconectarse,\u00a0PATH\u00a0retomar\u00e1 a\u00a0su valor por defecto, entonces \/home\/student\/HIB_scripts no existir\u00e1 m\u00e1s.<\/li>\n<\/ul>\n<ul>\n<li>De manera permanente:<br \/>\nSi deseas configurar PATH de forma permanente debes editar el archivo de configuraci\u00f3n de su <em>shell<\/em> de conexi\u00f3n. Como por lo general el <em>shell<\/em>\u00a0<em>bash<\/em>\u00a0es el m\u00e1s utilizado, debes editar el\u00a0archivo:\u00a0\/home\/user\/.bashrc. El comando entonces ser\u00eda:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ echo 'export PATH=$PATH:\/home\/student\/HIB_scripts' &gt;&gt; \/home\/user\/.bashrc<\/pre>\n<p>Despu\u00e9s de esto, en cada conexi\u00f3n la variable\u00a0PATH contendr\u00e1 el directorio\u00a0<em>\/home\/student HIB_scripts.<\/em> Esta operaci\u00f3n puede ser ejecutada por el usuario\u00a0<em>student<\/em>, no se necesitan los permisos de <em>root<\/em>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>En este apartado os vais a introducir en el dise\u00f1o de protocolos autom\u00e1ticos en un terminal bash. Dentro del campo de la bioinform\u00e1tica aprender a dise\u00f1ar protocolos es \u00fatil por varias razones. En primer lugar, permite la automatizaci\u00f3n de tareas repetitivas, lo que ahorra tiempo y reduce el riesgo de errores. En segundo lugar, permite [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/330"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/comments?post=330"}],"version-history":[{"count":19,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/330\/revisions"}],"predecessor-version":[{"id":1316,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/330\/revisions\/1316"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/media?parent=330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}