<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux Sin Humo (Publicaciones sobre shellcheck)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/shellcheck.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2026 &lt;a href="mailto:sebelk@gmail.com"&gt;sebelk&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;
</copyright><lastBuildDate>Tue, 26 May 2026 11:23:17 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>3 Power Tips + 1 Power Link I2</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i2/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;&lt;strong&gt;En esta edición: 3 poderosos consejos para bash, advirtiéndo sobre la letra chica de ellas y una noticia importante sobre certificados SSL/TLS.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="power-tip-1"&gt;Power Tip #1&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Agregar de manera inteligente y selectiva la opción pipefail en bash con &lt;code&gt;set -o pipefail&lt;/code&gt; a los scripts de bash.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;De esta manera, bastará con que un solo comando tenga un estado de salida distinto de &lt;code&gt;0&lt;/code&gt; para que el resultado final también de distinto de &lt;code&gt;0&lt;/code&gt;. Hay muchas publicaciones e incluso GPTs que aconsejan el uso de &lt;code&gt;pipefail&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Esto puede ser valioso cuando cualquier comando unido por &lt;code&gt;|&lt;/code&gt; tiene que terminar sin errores para que tenga sentido continuar con la ejecución del script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sin embargo, acá van algunas recomendaciones:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Evitar &lt;code&gt;set -o pipefail&lt;/code&gt; globalmente al usar comandos como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grep -q&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;head&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk 'exit'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed 'q'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activar &lt;code&gt;pipefail&lt;/code&gt; solo donde realmente sea necesaria:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;pipefail&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;comando1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;comando2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;O desactivar luego de usarla:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;pipefail
comando1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;comando2
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+o&lt;span class="w"&gt; &lt;/span&gt;pipefail
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="power-tip-2"&gt;Power Tip #2&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Realizá tus propios tests para decidir si un script tiene que terminar al ocurrir un error&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Se puede leer en el &lt;a href="https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#writing-maintainer-scripts"&gt;Debian Policy Manual&lt;/a&gt; que recomienda fuertemente  el uso  &lt;code&gt;set -e&lt;/code&gt;. Esa opción le dice a bash que cuando un comando termina en un estado de salida de distinto de &lt;code&gt;0&lt;/code&gt; el script debe termina inmediatamente. La cuestión es que esa opción tiene muchas de excepciones (&lt;em&gt;algo que se puede verificar al leer la manpage de bash&lt;/em&gt;), lo cual hace el uso de esta configuración poco confiable en scripts de gran complejidad.
Tenemos que comprender que bash sabe poco de la semántica. Por ejemplo, considerar este sencillo script:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#! /bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/admin/download
curl&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;https://example.com/project.zip
unzip&lt;span class="w"&gt; &lt;/span&gt;project.zip
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;El comando curl no tiene &lt;strong&gt;exit status distinto de 0&lt;/strong&gt; si obtiene http code 404, &lt;strong&gt;bash no sabe como cada herramienta externa maneja el exit status&lt;/strong&gt;. Si el archivo projec.zip ya existe, el comando unzip estará operando sobre el la versión del archivo que probablemente no queremos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lo correcto que nosotros mismos le agreguemos la lógica necesaria de acuerdo a lo que estamos necesitando&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Probablemente alguien puede estar tentado a agregarle la opción &lt;code&gt;-f&lt;/code&gt; sin embargo la propia manpage de &lt;code&gt;curl&lt;/code&gt; dice que no es 100% segura. Además puede haber casos en los que necesitamos saber exactamente el tipo de problema que hubo. En tal caso lo mejor será obtener el http code con curl y evaluar dicho código con bash, es decir hacemos que &lt;strong&gt;cada herramienta haga lo mejor que sabe hacer&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="power-tip-3"&gt;Power Tip #3&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usar &lt;code&gt;set -u&lt;/code&gt; para forzar a que el script termine con error si hay hay variables no definidas&lt;/strong&gt;. En general, esta opción tiene menos tiene contraindicaciones que las dos anteriores. &lt;strong&gt;Es altamente conveniente combinarla con la herramienta &lt;code&gt;shellcheck&lt;/code&gt;&lt;/strong&gt;. Por ejemplo, en el siguiente script:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-u
&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DEBUG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Modo debug"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$somevar&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;someanothervar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;No tiene definida la variable &lt;code&gt;DEBUG&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No tiene definida la variable &lt;code&gt;somevar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La variable &lt;code&gt;someanothervar&lt;/code&gt; si bien está definida no se usa nunca. No es un error grave, pero al no utilizarse probablemente sea inncesaria, pero es algo que no es detectado por &lt;code&gt;set -u&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/shellcheck.webp"&gt;&lt;img src="https://sergiobelkin.com/images/shellcheck.thumbnail.webp" alt="ShellCheck"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;¿Certificados SSL/TLS para direcciones IP?&lt;/strong&gt;:
&lt;a href="https://letsencrypt.org/2025/07/01/issuing-our-first-ip-address-certificate/"&gt;We've Issued Our First IP Address Certificate&lt;/a&gt;&lt;/p&gt;</description><category>bash</category><category>shellcheck</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i2/</guid><pubDate>Sat, 05 Jul 2025 19:57:16 GMT</pubDate></item></channel></rss>