{"id":747,"date":"2023-10-18T14:06:37","date_gmt":"2023-10-18T12:06:37","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=747"},"modified":"2025-02-11T00:30:54","modified_gmt":"2025-02-10T22:30:54","slug":"1-15-disseny-de-protocols-automatics-al-terminal","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/1-15-disseny-de-protocols-automatics-al-terminal\/","title":{"rendered":"1.15. Disseny de protocols autom\u00e0tics al terminal"},"content":{"rendered":"<p>En aquest apartat us introduireu en el disseny de protocols autom\u00e0tics en un terminal <em>bash<\/em>. Dins del camp de la bioinform\u00e0tica aprendre a dissenyar protocols \u00e9s \u00fatil per diverses raons. En primer lloc, permet l\u2019automatitzaci\u00f3 de tasques repetitives, la qual cosa estalvia temps i redueix el risc d\u2019errors. En segon lloc, permet la creaci\u00f3 de fluxos de treball reprodu\u00efbles, que s\u00f3n essencials per a la recerca cient\u00edfica. En tercer lloc, <em>bash<\/em> \u00e9s una eina poderosa i flexible que es pot utilitzar per manipular conjunts de dades grans i realitzar an\u00e0lisis complexes. Finalment, l\u2019\u00fas de protocols (en angl\u00e8s, <em>script<\/em>) <em>bash<\/em> facilita la col\u00b7laboraci\u00f3 i l\u2019intercanvi de protocols, cosa que fa que sigui m\u00e9s f\u00e0cil per als investigadors reproduir la feina d\u2019altres i construir-hi. En general, el disseny de protocols autom\u00e0tics en un terminal <em>bash<\/em> \u00e9s una forma eficient i efectiva de realitzar an\u00e0lisis de bioinform\u00e0tica.<\/p>\n<p>En dissenyar un protocol en un terminal <em>bash<\/em>, hi ha diversos aspectes t\u00e8cnics i par\u00e0metres que s\u2019han de tenir en compte. Aqu\u00ed es presenten els aspectes m\u00e9s importants que cal considerar.<\/p>\n<ul>\n<li><strong>Sintaxi i gram\u00e0tica<\/strong>: el protocol ha de tenir una sintaxi i una gram\u00e0tica ben definides que siguin f\u00e0cils d\u2019entendre i seguir.<\/li>\n<li><strong>Maneig d\u2019errors<\/strong>: el protocol ha d\u2019estar dissenyat per manejar errors i excepcions de manera elegant. Aix\u00f2 inclou la definici\u00f3 de codis d\u2019error i missatges.<\/li>\n<li><strong>Seguretat<\/strong>: el protocol ha d\u2019estar dissenyat per garantir la privacitat i seguretat de les dades. Aix\u00f2 inclou mesures com l\u2019encriptaci\u00f3, l\u2019autenticaci\u00f3 i el control d\u2019acc\u00e9s.<\/li>\n<li><strong>Compatibilitat<\/strong>: el protocol ha de ser compatible amb el <em>hardware <\/em>i el <em>software<\/em> del sistema en el qual s\u2019utilitzar\u00e0.<\/li>\n<li><strong>Efici\u00e8ncia<\/strong>: el protocol ha d\u2019estar dissenyat per ser eficient i optimitzar l\u2019\u00fas dels recursos del sistema, com la CPU i la mem\u00f2ria.<\/li>\n<li><strong>Escalabilitat<\/strong>: el protocol ha d\u2019estar dissenyat per ser escalable, de manera que pugui manejar quantitats creixents de dades i usuaris sense degradaci\u00f3 del rendiment.<\/li>\n<li><strong>Documentaci\u00f3:<\/strong> el protocol ha d\u2019estar ben documentat, amb instruccions clares i exemples per a la seva implementaci\u00f3 i \u00fas.<\/li>\n<li><strong>Proves<\/strong>: el protocol ha de ser provat exhaustivament per assegurar que la seva funcionalitat i rendiment compleixin amb els requisits.<\/li>\n<\/ul>\n<p>Tenint en compte aquests aspectes t\u00e8cnics i par\u00e0metres, el protocol pot ser dissenyat per ser efectiu, segur i eficient en el seu funcionament. En aquest apartat se us mostra com dissenyar protocols senzills, i no es tindr\u00e0 en compte tot el que s\u2019ha esmentat anteriorment, per\u00f2 sempre s\u2019ha de treballar tenint en compte totes les consideracions esmentades.<\/p>\n<p>En aquest exercici se us mostrar\u00e0 com generar un protocol per obtenir informaci\u00f3 biol\u00f2gica rellevant a partir de 3 seq\u00fc\u00e8ncies FASTA. T\u2019animo a realitzar tots els passos que es mostren a continuaci\u00f3. Obre un terminal i comen\u00e7a.<\/p>\n<p>1) Crea un directori:<\/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) Descarrega, en l\u2019anterior directori i des de la base de dades ENA (<em>European Nucleotide Archive<\/em>), les seq\u00fc\u00e8ncies FASTA associades als gens humans de BRCA1, BRCA2 i 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) Quan es volen executar una s\u00e8rie d\u2019ordres de forma seq\u00fcencial al terminal <em>bash<\/em>, es crea un <em>script<\/em> o protocol i es guarda en un arxiu de text amb extensi\u00f3 \u00ab<code>.sh<\/code>\u00bb. Aquest <em>script<\/em> ens permet referir-nos internament als seus par\u00e0metres de manera gen\u00e8rica, la qual cosa significa que pot funcionar en qualsevol grup d\u2019arguments del mateix tipus. A m\u00e9s, per fer-lo m\u00e9s flexible s\u2019han d\u2019especificar aquests par\u00e0metres gen\u00e8rics dins de <em>l\u2019script<\/em>, de manera que, quan s\u2019invoqui <em>l\u2019script<\/em> des de la l\u00ednia d\u2019ordres, podem substituir aquests par\u00e0metres gen\u00e8rics per valors espec\u00edfics proporcionats per l\u2019usuari juntament amb el nom de l\u2019ordre. En utilitzar aquest enfocament, es poden automatitzar tasques repetitives o processos complexos, la qual cosa fa que la feina sigui m\u00e9s eficient i consistent.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ vi analitza_fasta.sh<\/pre>\n<p>4) Abans d\u2019introduir el codi per generar un protocol, dues consideracions a tenir en compte:<\/p>\n<ul>\n<li>En la primera l\u00ednia del protocol s\u2019ha d\u2019indicar, sempre, l\u2019int\u00e8rpret d\u2019ordres <code>bash<\/code> (GNU Bourne-Again SHell). En la majoria dels sistemes coexisteixen altres int\u00e8rprets com <code>sh<\/code> (Bourne) o <code>csh<\/code> (C shell). El directori on es localitza l\u2019int\u00e8rpret s\u2019escriu a continuaci\u00f3 del conjunt de s\u00edmbols <code>#!<\/code><\/li>\n<li>Per introduir comentaris en el protocol s\u2019ha d\u2019introduir el s\u00edmbol <code>#<\/code> (en angl\u00e8s, <em>shebang<\/em>) a la primera columna del fitxer.<\/li>\n<\/ul>\n<p>5) Escriu cadascuna de les seg\u00fcents l\u00ednies en el fitxer <em>sh<\/em> que acabes d\u2019obrir. Has d\u2019escriure en mode <em>insert<\/em>, el primer que has de fer \u00e9s teclejar la lletra <em><code>i<\/code><\/em>, i a continuaci\u00f3 escriu les l\u00ednies seg\u00fcents:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">#!\/bin\/bash<\/pre>\n<p># Aquest protocol analitza un fitxer que cont\u00e9 una \u00fanica seq\u00fc\u00e8ncia FASTA<\/p>\n<p># Primer, se subministra el nom del fitxer com a argument<\/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 \"Per favor, subministra un nom de fitxer com a argument\"\r\n\r\n\u00a0\u00a0\u00a0 exit 1\r\n\r\nfi<\/pre>\n<p># El s\u00edmbol $$ indica el PID del proc\u00e9s<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"El valor del PID del proc\u00e9s \u00e9s\";\r\n\r\necho \"PID \u00e9s $$\";<\/pre>\n<p># $1 representa el primer argument a analitzar. En aquest cas el nom del fitxer FASTA<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"La mida del fitxer FASTA \u00e9s:\";\r\n\r\nls -sh $1 | gawk '{print $1}';\r\n\r\necho \"Nombre de l\u00ednies del fitxer FASTA:\";\r\n\r\nwc -l $1 | gawk '{ print $1 }';\r\n\r\necho \"Extreu les primeres set l\u00ednies del fitxer\";\r\n\r\nhead -7 $1;<\/pre>\n<p># Les seg\u00fcents dues l\u00ednies considera comentar-les, si la seq\u00fc\u00e8ncia FASTA t\u00e9 moltes l\u00ednies<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"Extreu la seq\u00fc\u00e8ncia del fitxer FASTA\";\r\n\r\nsequence=$(awk '\/^&gt;\/ {next} {printf \"%s\", $0} END {print \"\"}' \"$1\")\r\n\r\necho \"$sequence\"<\/pre>\n<p># C\u00e0lcul de la longitud de la seq\u00fc\u00e8ncia<\/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 seq\u00fc\u00e8ncia: $length nucleotids\"<\/pre>\n<p># Compte el n\u00famero de nucle\u00f2tids que t\u00e9 la seq\u00fc\u00e8ncia<\/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># S\u2019han generat <em>in situ<\/em> 4 noves variables. Imprimeix cada nombre de nucle\u00f2tids<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"Nombre de nucle\u00f2tid A: $num_A\"\r\n\r\necho \"Nombre de nucle\u00f2tid C: $num_C\"\r\n\r\necho \"Nombre de nucle\u00f2tid G: $num_G\"\r\n\r\necho \"Nombre de nucle\u00f2tid T: $num_T\"<\/pre>\n<p># C\u00e0lcul del contingut GC de la seq\u00fc\u00e8ncia<\/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\u00f3 dels ORFs de la seq\u00fc\u00e8ncia<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">echo \"Identificant 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 es troben 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 \"Nombre d'ORFs: $num_ORFs\"\r\n\r\n\u00a0\u00a0\u00a0 echo \"ORFs: $ORFs\"\r\n\r\nfi<\/pre>\n<p>Salva el fitxer que s\u2019ha creat escrivint: <code>wq! analitza_fasta.sh<\/code><\/p>\n<p>6) Per executar l\u2019<em>script<\/em>, salva l\u2019anterior fitxer amb l\u2019extensi\u00f3 &#8220;.<code>sh<\/code>&#8221; i fes-lo executable amb l\u2019ordre <code>chmod +x<\/code>. Executa\u2019l amb el nom del fitxer FASTA a analitzar:<\/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 analitza_fasta.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ .\/analitza_fasta.sh AC060780.18.fasta\r\n<\/pre>\n<p>7)Fins ara s\u2019ha generat un protocol per analitzar fitxers FASTA, s\u2019ha executat i comprovat que funciona. El seg\u00fcent pas \u00e9s executar l\u2019anterior fitxer d\u2019an\u00e0lisi en un directori amb diferents seq\u00fc\u00e8ncies. Per a aix\u00f2, es genera un altre protocol que inclogui l\u2019anterior. El nou protocol es diu <code>analitza_fasta_dir.sh<\/code>. Els passos per seguir s\u00f3n:<\/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 analitza_fasta_dir.sh<\/pre>\n<p>Les ordres que cal introduir en aquest fitxer s\u00f3n:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">#! \/bin\/bash\r\n\r\necho \"S\u2019inicia l\u2019execuci\u00f3 amb el  PID $$\";\r\n\r\necho \"Nombre d\u2019arguments a analitzar  $#\";\r\n\r\necho \"El nom del directori a analitzar  $1\";\r\n\r\necho \"Els noms dels fitxers que s\u2019analitzen s\u00f3n\";\r\n\r\nls $1;\r\n\r\necho \"Execuci\u00f3 del protocol d\u2019an\u00e0lisi FASTA per a cadascun dels fitxers en el directori\";\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 \"execuci\u00f3 analitza_fasta.sh $file\";\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .\/analitza_fasta.sh $1\/$file;\r\n\r\n\u00a0\u00a0\u00a0\u00a0 done<\/pre>\n<p>Salva el fitxer que s\u2019ha creat escrivint :<code>wq! analitza_fasta_dir.sh<\/code><\/p>\n<p>8) Per executar l\u2019<em>script<\/em>, salva l\u2019anterior fitxer amb l\u2019extensi\u00f3 <code>.sh<\/code> i fes-lo executable amb l\u2019ordre <code>chmod +x<\/code>. Executa-ho amb el nom del directori que cont\u00e9 els fitxers FASTA a analitzar:<\/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\/analitza_fasta.sh .<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ chmod +x analitza_fasta_dir.sh<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ .\/analitza_fasta_dir.sh fasta_sequence<\/pre>\n<p>Es pot observar que els protocols que s\u2019executen es troben en el directori actual de treball (.\/) en lloc de nom\u00e9s invocar el seu nom. No obstant aix\u00f2, un cop s\u2019est\u00e0 segur que <em>l\u2019script<\/em> funciona correctament, \u00e9s m\u00e9s convenient guardar tota la nostra col\u00b7lecci\u00f3 de protocols en un sol directori del sistema. D\u2019aquesta manera, no s\u2019han de mantenir m\u00faltiples c\u00f2pies i es podran executar des de qualsevol lloc en el nostre arbre de directoris.<\/p>\n<p>Les plataformes Gnu\/Linux tenen un conjunt de variables globals que contenen dades de car\u00e0cter general. Es resumeixen a la taula seg\u00fcent, la taula 16.<\/p>\n<div class=\"tabletitle\"><\/p>\n<p>Taula 16. Ordres per a l\u2019execuci\u00f3 de <em>scripts<\/em>.<\/p>\n<\/div>\n<table width=\"603\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"113\"><strong>Ordre<\/strong><\/td>\n<td width=\"490\"><strong>Descripci\u00f3<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>set<\/code><\/td>\n<td width=\"490\">Estableix valors que seran usats pels programes, aplicaci\u00f3, <em>scripts<\/em><\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>echo<\/code><\/td>\n<td width=\"490\">Imprimeix el que se li encarrega que faci<\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>printenv<\/code><\/td>\n<td width=\"490\">Llista la llista completa de variables d\u2019entorn de la teva versi\u00f3 Gnu\/Linux<\/td>\n<\/tr>\n<tr>\n<td width=\"113\"><code>which<\/code><\/td>\n<td width=\"490\">Localitza els arxius executables d\u2019una determinada aplicaci\u00f3<\/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>Font: elaboraci\u00f3 pr\u00f2pia.<\/p>\n<\/div>\n<p>L\u2019ordre <code>set<\/code> a Gnu\/Linux mostra i estableix variables d\u2019entorn per a la sessi\u00f3 actual. S\u2019utilitza per veure el valor de les variables d\u2019entorn del sistema i tamb\u00e9 per assignar valors a noves variables d\u2019entorn. L\u2019ordre <code>echo<\/code><em>,<\/em> d\u2019altra banda, s\u2019utilitza per mostrar missatges de text o el valor de les variables a la pantalla. Tamb\u00e9 es pot utilitzar per escriure text en arxius o per concatenar diversos missatges de text.<\/p>\n<p>L\u2019avantatge d\u2019utilitzar<em> echo <\/em>\u00e9s que permet seleccionar i mostrar nom\u00e9s la informaci\u00f3 que es necessita, el que fa que sigui m\u00e9s f\u00e0cil de llegir i entendre. D\u2019altra banda, l\u2019avantatge d\u2019utilitzar <em>set<\/em> \u00e9s que permet establir i modificar variables d\u2019entorn, la qual cosa pot ser \u00fatil en automatitzar tasques i <em>scripts<\/em> a Gnu\/Linux.<\/p>\n<p>Obre un terminal de Gnu\/Linux. Pots veure la llista completa de variables d\u2019entorn de la teva versi\u00f3 de Gnu\/Linux utilitzant l\u2019ordre <code>printenv<\/code>.\u00a0Pots tenir una llista m\u00e9s manejable afegint-hi diferents ordres:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$printenv | less<\/pre>\n<p>Cada l\u00ednia cont\u00e9 el nom de la variable d\u2019entorn Gnu\/Linux seguit de = i del valor. Per exemple:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">HOME=\/home\/student<\/pre>\n<p>Aix\u00f2 vol dir que HOME \u00e9s una variable d\u2019entorn de Gnu\/Linux que t\u00e9 el valor establert com <em>a directori \/home\/student<\/em>.<\/p>\n<p>Les variables d\u2019entorn solen estar en maj\u00fascules, tot i que tamb\u00e9 pots crear variables d\u2019entorn en min\u00fascules. La sortida de <code>printenv<\/code> mostra totes les variables d\u2019entorn en maj\u00fascules. Una cosa important per tenir en compte \u00e9s que les variables d\u2019entorn de Gnu\/Linux distingeixen entre maj\u00fascules i min\u00fascules. Si desitges veure el valor d\u2019una variable d\u2019entorn espec\u00edfica, pots fer-ho considerant el nom d\u2019aquesta variable com a argument de l\u2019ordre <code>printenv<\/code>. La cadena de car\u00e0cters completa es veuria aix\u00ed en la l\u00ednia d\u2019ordre:<\/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 sintaxi b\u00e0sica per crear una variable d\u2019entorn a Gnu\/Linux \u00e9s la seg\u00fcent. \u00c9s f\u00e0cil aconseguir-ho, nom\u00e9s es necessita especificar un nom i un valor. Seguirem la convenci\u00f3 de mantenir totes les lletres en maj\u00fascules per al nom de la variable, i l\u2019establirem com una cadena simple.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ HIB_VAR='BioInformatica i BioEstadistica!'<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ export HIB_VAR<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ export HIB_VAR='BioInformatica i BioEstadistica!'\u00a0\u00a0\u00a0 #en una \u00fanica l\u00ednia<\/pre>\n<p>S\u2019han fet servir cometes simples, ja que el valor de la variable cont\u00e9 un espai. A m\u00e9s, s\u2019han utilitzat cometes simples perqu\u00e8 el signe d\u2019exclamaci\u00f3 \u00e9s un car\u00e0cter especial en la <em>shell bash<\/em> que normalment s\u2019expandeix a l\u2019historial de <em>bash<\/em> si no s\u2019escapa o es col\u00b7loca entre cometes simples. Ara tenim una variable de la <em>shell<\/em>. Aquesta variable est\u00e0 disponible en la nostra sessi\u00f3 actual, per\u00f2 no es transmet als processos secundaris.<\/p>\n<p>Es pot comprovar, buscant la nostra nova variable dins de la sortida 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 i BioEstadistica!'<\/pre>\n<p>Si la variable s\u2019ha definit correctament, podr\u00e0s utilitzar-la en qualsevol protocol que executis en la mateixa sessi\u00f3 del terminal. Per exemple, si crees un arxiu de <em>script<\/em> en <em>bash<\/em> que requereix utilitzar la variable <code>HIB_VAR<\/code>, simplement pots referir-t\u2019hi utilitzant el s\u00edmbol <code>$<\/code>. Per exemple, si el teu arxiu de <em>script<\/em> s\u2019anomena<em><code> myscript.sh<\/code><\/em>\u00a0 i cont\u00e9 el seg\u00fcent codi:<\/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 s\u2019executa l\u2019arxiu de <em>script<\/em> en la mateixa sessi\u00f3 del terminal utilitzant l\u2019ordre <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 i Bioestadistica!<\/pre>\n<p>l\u2019arxiu de <em>script<\/em> hauria d\u2019imprimir el valor de la variable <code>HIB_VAR<\/code> que vas definir pr\u00e8viament. Per revertir el valor d\u2019una variable es pot fer servir l\u2019ordre <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 i 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>D\u2019altra banda, tens en compte que, si tanques la sessi\u00f3 del terminal i la tornes a obrir, haur\u00e0s de tornar a definir la variable local utilitzant l\u2019ordre <code>export<\/code>. Per evitar aix\u00f2, pots agregar la definici\u00f3 de la variable HIB_VAR al teu arxiu d\u2019inici de <em>bash<\/em> (per exemple, <code>~\/.bashrc<\/code>), de manera que la variable estigui disponible cada vegada que inici\u00efs una nova sessi\u00f3 del terminal.<\/p>\n<p>L\u2019ordre <code>which<\/code> \u00e9s una eina que permet trobar r\u00e0pidament els arxius executables d\u2019una determinada aplicaci\u00f3 i localitza els fitxers executables mitjan\u00e7ant la variable d\u2019entorn 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>Finalment, es defineix la variable PATH. El contingut de la variable PATH \u00e9s una cadena que cont\u00e9 <code>paths<\/code> de directoris separats per dos punts, i aquests s\u00f3n els directoris en qu\u00e8 la <em>shell<\/em> busca l\u2019ordre que l\u2019usuari escriu des del teclat.<\/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 recerca no es realitza en l\u2019ordre en el qual estan els directoris en la variable PATH. Quan s\u2019escriu una ordre a la <em>shell<\/em> buscar\u00e0 primer a <code>\/usr\/local\/bin<\/code>, despr\u00e9s a <code>\/usr\/bin<\/code>, a continuaci\u00f3 a <code>\/usr\/games<\/code> i finalment a <code>\/snap\/bin<\/code>. Des del moment en qu\u00e8 la <em>shell<\/em> troba l\u2019ordre, det\u00e9 la recerca i executa l\u2019ordre trobada. Podem escriure una ordre utilitzant:<\/p>\n<ul>\n<li>El seu nom:<br \/>\nEl path absolut (<em>\/bin\/cat \/etc\/passwd<\/em> ).<br \/>\nEl path relatiu (utilitzant \u00ab.\u00bb o \u00ab&#8230;.\u00bb en general per als programes o <em>scripts<\/em> que no es troben al PATH).<br \/>\nEs pot afegir un directori a la variable PATH, afegim el directori on es troben tots els <em>scripts<\/em> que es generin.<\/li>\n<li>\u00danicament per a la sessi\u00f3 activa:<br \/>\nSi desitges afegir, per exemple: <code>\/home\/student\/HIB_scripts<\/code> a la variable <code>PATH<\/code>, escriu a la <em>shell<\/em> el seg\u00fcent segons el cas.<\/li>\n<\/ul>\n<p># Per tenir el directori 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># Per tenir el directori a l\u2019inici 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>Ara pots utilitzar el programa escrivint simplement el seu nom. En desconnectar-se, PATH reprendr\u00e0 al seu valor per defecte, llavors \/home\/student\/HIB_scripts no existir\u00e0 m\u00e9s.<\/p>\n<ul>\n<li>De manera permanent:<br \/>\nSi desitges configurar PATH de forma permanent has d\u2019editar l\u2019arxiu de configuraci\u00f3 de la seva <em>shell<\/em> de connexi\u00f3. Com que en general la <em>shell bash<\/em> \u00e9s el m\u00e9s utilitzat, has d\u2019editar l\u2019arxiu: \/home\/user\/.bashrc. L\u2019ordre llavors seria:<\/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>Despr\u00e9s d\u2019aix\u00f2, en cada connexi\u00f3 la variable PATH contindr\u00e0 el directori <em>\/home\/student HIB_scripts.<\/em> Aquesta operaci\u00f3 pot ser executada per l\u2019usuari <em>student<\/em>, no es necessiten els permisos de <em>root<\/em>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>En aquest apartat us introduireu en el disseny de protocols autom\u00e0tics en un terminal bash. Dins del camp de la bioinform\u00e0tica aprendre a dissenyar protocols \u00e9s \u00fatil per diverses raons. En primer lloc, permet l\u2019automatitzaci\u00f3 de tasques repetitives, la qual cosa estalvia temps i redueix el risc d\u2019errors. En segon lloc, permet la creaci\u00f3 de [&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\/wp-json\/wp\/v2\/pages\/747"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/comments?post=747"}],"version-history":[{"count":16,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/747\/revisions"}],"predecessor-version":[{"id":1261,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/747\/revisions\/1261"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/media?parent=747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}