{"id":4116,"date":"2018-08-14T14:29:36","date_gmt":"2018-08-14T18:29:36","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=4116"},"modified":"2018-08-14T14:29:36","modified_gmt":"2018-08-14T18:29:36","slug":"documentez-votre-travail-par-lajout-de-parametres-a-vos-scripts-shell","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/documentez-votre-travail-par-lajout-de-parametres-a-vos-scripts-shell\/","title":{"rendered":"Documentez votre travail par l&rsquo;ajout de param\u00e8tres \u00e0 vos scripts shell"},"content":{"rendered":"<p>\u00c0 un certain moment dans votre carri\u00e8re de bioinformaticien, vous aurez \u00e0 \u00e9crire des scripts shell, c&rsquo;est in\u00e9vitable ! Alors discutons d&rsquo;une strat\u00e9gie qui vous permettra \u00e0 la fois de rendre vos scripts r\u00e9-utilisables et de garder une trace des param\u00e8tres utilis\u00e9s pour g\u00e9n\u00e9rer une s\u00e9rie de r\u00e9sultats.<\/p>\n<p>(<strong>Avertissement<\/strong>: les proc\u00e9dures d\u00e9crites ci-bas ont \u00e9t\u00e9 test\u00e9es \u00e0 l&rsquo;aide du shell BASH, des modifications pourraient s&rsquo;av\u00e9rer n\u00e9cessaires si vous utilisez un shell diff\u00e9rent.)<\/p>\n<p>Il existe plusieurs techniques pour passer des param\u00e8tres \u00e0 vos scripts shell.  <\/p>\n<h3>Variables shell num\u00e9rot\u00e9es<\/h3>\n<p>Une mani\u00e8re hyper simple consiste \u00e0 utiliser les <em>variables shell num\u00e9rot\u00e9es<\/em>. Grosso modo, toute chaine de caract\u00e8res ajout\u00e9e \u00e0 la suite de votre appel de script devient disponible \u00e0 l&rsquo;int\u00e9rieur de celui-ci par le biais des variables $1, $2, etc..<\/p>\n<pre><code class=\"bash\">%> cat simple_script.sh\r\n#!\/bin\/bash\r\necho \"Salutation: ${1}\"\r\necho \"Cible: ${2}\"\r\n\r\n%> .\/simple_script.sh hello world\r\nSalutation: hello\r\nCible: world  <\/code><\/pre>\n<p>(<strong>Astuce<\/strong>: Bien que ce ne soit pas n\u00e9cessaire, le fait d&rsquo;envelopper vos noms de variable au sein d&rsquo;accolades ({}) est une bonne pratique qui pourrait vous \u00e9pargner des maux de t\u00eate plus tard.)<\/p>\n<p>C&rsquo;est pratique, mais ce n&rsquo;est pas exactement le but recherch\u00e9. De plus, le positionnement des arguments devient fixe alors on perd un peu de flexibilit\u00e9.<\/p>\n<h3>Utilitaire getopts<\/h3>\n<p>La seconde option \u00e0 laquelle nous sommes confront\u00e9s est g\u00e9n\u00e9ralement l&rsquo;usage de l&rsquo;utilitaire getopts. <\/p>\n<pre><code>%> cat getopts_script.sh\r\n#!\/bin\/bash\r\nwhile getopts s:c: option\r\ndo\r\n  case \"${option}\"\r\n  in\r\n    s) SALUTATION=${OPTARG};;\r\n    c) CIBLE=${OPTARG};;\r\n  esac\r\ndone\r\n\r\necho \"Salutation: ${GREETING}\"\r\necho \"Cible: ${TARGET}\"\r\n\r\n%> .\/getopts_script.sh -s hello -c world\r\nSalutation: hello\r\nCible: world  <\/code><\/pre>\n<p>Nous sommes maintenant libres de fournir les param\u00e8tres dans l&rsquo;ordre de notre choix:<\/p>\n<pre><code class=\"bash\">% .\/getopts_script.sh -c world -s hello\r\nSalutation: hello\r\nCible: world  <\/code><\/pre>\n<p>On se rapproche de notre but !<br \/>\nMais avant de poursuivre, prenons quelques instants pour bien comprendre ce qui se passe.<br \/>\nEssentiellement, nous it\u00e9rons au travers des param\u00e8tres pass\u00e9s lors de l&rsquo;appel du script (la <strong>boucle while<\/strong>) et nous ex\u00e9cutons des blocs d&rsquo;instructions en r\u00e9action \u00e0 la pr\u00e9sence des param\u00e8tres (\u00e0 l&rsquo;aide du <strong>bloc case<\/strong>).<\/p>\n<h3>Mettons tout \u00e7a ensemble<\/h3>\n<p>Utilisons ce que nous avons vu jusqu&rsquo;ici afin de r\u00e9aliser notre but d&rsquo;obtenir un script r\u00e9-utilisable ainsi qu&rsquo;une trace des param\u00e8tres utilis\u00e9s lors de son ex\u00e9cution.<\/p>\n<p>Consid\u00e9rons ce script freebayes.sh tout simple:<\/p>\n<pre><code class=\"bash\">%> cat freebayes.sh\r\n#!\/bin\/bash\r\n${FREEBAYES_SOFT} -C ${COUVERTURE} -f ${GENOME} ${BAM} > ${PWD}\/var.${COUVERTURE}X.vcf<\/code><\/pre>\n<p>Comme vous pouvez le constater, la valeur des param\u00e8tres suivants doit \u00eatre fournie par l&rsquo;utilisateur:<br \/>\n<code><br \/>\nFREEBAYES_SOFT: l'ex\u00e9cutable Freebayes<br \/>\nCOUVERTURE: la valeur du param\u00e8tre couverture de Freebayes<br \/>\nGENOME: l'emplacement du g\u00e9nome de r\u00e9f\u00e9rence<br \/>\nBAM: l'emplacement du fichier .bam contenant nos donn\u00e9es SNG align\u00e9es<br \/>\n<\/code><br \/>\n(<strong>Astuce<\/strong>: PWD est une variable BASH qui r\u00e9f\u00e9rence le r\u00e9pertoire courant) <\/p>\n<p>Ajoutons un peu de code pour traiter les param\u00e8tres:<\/p>\n<pre><code class=\"bash\">%> cat freebayes.sh\r\n#!\/bin\/bash\r\nwhile getopts c: option\r\ndo\r\n  case \"${option}\"\r\n  in\r\n    c) source ${OPTARG};;\r\n  esac\r\ndone\r\n\r\n${FREEBAYES_SOFT} -C ${COUVERTURE} -f ${GENOME} ${BAM} > ${PWD}\/var.${COUVERTURE}X.vcf<\/code><\/pre>\n<p>Mais attendez un instant, pourquoi s&rsquo;attend-on \u00e0 ne recevoir qu&rsquo;un seul argument ? La r\u00e9ponse se trouve dans la commande <a href=\"https:\/\/en.wikipedia.org\/wiki\/Source_(command)\" rel=\"noopener\" target=\"_blank\">source<\/a>.<br \/>\nJe vous ai promis une trace des param\u00e8tres utilis\u00e9s lors de l&rsquo;ex\u00e9cution, non ?<br \/>\nEt bien, on peut maintenant atteindre notre but en sp\u00e9cifiant les valeurs des param\u00e8tres n\u00e9cessaires \u00e0 l&rsquo;ex\u00e9cution de freebayes.sh au sein d&rsquo;un second fichier (appelons-le freebayes_run.conf) de cette mani\u00e8re:<\/p>\n<pre><code class=\"bash\">%> cat freebayes_run.conf\r\n#!\/bin\/bash\r\nFREEBAYES_SOFT=\/soft\/bioinfo\/freebayes-1.2.0\/bin\/freebayes\r\nCOUVERTURE=5\r\nGENOME=\/soft\/bioinfo\/resources\/genomes\/GRCh38_88\/genome\/GRCh38.fa\r\nBAM=~\/mon_projet\/alignments\/mon_echantillon.bam\r\n<\/code><\/pre>\n<p>On peut maintenant storer notre script <em>freebayes.sh<\/em> r\u00e9-utilisable dans un r\u00e9pertoire g\u00e9n\u00e9ral (tel que ~\/mon_projet\/lib\/) et l&rsquo;ex\u00e9cuter \u00e0 partir d&rsquo;un autre r\u00e9pertoire en pr\u00e9cisant le fichier .conf \u00e0 utiliser. Une bonne strat\u00e9gie consiste \u00e0 storer le fichier .conf au sein du r\u00e9pertoire de l&rsquo;analyse.<\/p>\n<pre><code class=\"bash\">%> ~\/mon_projet\/lib\/freebayes.sh -c .\/freebayes_run.conf<\/code><\/pre>\n<p>De cette fa\u00e7on, lorsque l&rsquo;on voudra v\u00e9rifier la version du binaire freebayes ou du g\u00e9nome de r\u00e9f\u00e9rence utilis\u00e9 pour cr\u00e9er le jeux de donn\u00e9es quelques mois ou ann\u00e9es plus tard, nous n&rsquo;aurons qu&rsquo;\u00e0 consulter le fichier .conf ! Travailler ainsi repr\u00e9sente s\u00fbrement un effort suppl\u00e9mentaire , mais je crois que le jeu en vaut la chandelle.<\/p>\n<p>Laissez-moi savoir ce que vous en pensez !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c0 un certain moment dans votre carri\u00e8re de bioinformaticien, vous aurez \u00e0 \u00e9crire des scripts shell, c&rsquo;est in\u00e9vitable ! Alors discutons d&rsquo;une strat\u00e9gie qui vous permettra \u00e0 la fois de rendre vos scripts r\u00e9-utilisables et de garder une trace des param\u00e8tres utilis\u00e9s pour g\u00e9n\u00e9rer une s\u00e9rie de r\u00e9sultats. (Avertissement: les proc\u00e9dures d\u00e9crites ci-bas ont \u00e9t\u00e9 test\u00e9es \u00e0 l&rsquo;aide du shell BASH, des modifications pourraient s&rsquo;av\u00e9rer n\u00e9cessaires si vous utilisez un shell diff\u00e9rent.) Il existe plusieurs techniques pour passer des param\u00e8tres <a href=\"https:\/\/bioinfo.iric.ca\/fr\/documentez-votre-travail-par-lajout-de-parametres-a-vos-scripts-shell\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[41],"tags":[],"class_list":["post-4116","post","type-post","status-publish","format-standard","hentry","category-bioinformatique"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/4116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=4116"}],"version-history":[{"count":7,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/4116\/revisions"}],"predecessor-version":[{"id":4123,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/4116\/revisions\/4123"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=4116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=4116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=4116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}