<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: uvsmtid</title>
    <description>The latest articles on DEV Community by uvsmtid (@uvsmtid).</description>
    <link>https://dev.to/uvsmtid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2279287%2Ffb32948a-d597-490b-b008-9a965569f69c.jpg</url>
      <title>DEV Community: uvsmtid</title>
      <link>https://dev.to/uvsmtid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uvsmtid"/>
    <language>en</language>
    <item>
      <title>From `shell` to `python` - what stops you?</title>
      <dc:creator>uvsmtid</dc:creator>
      <pubDate>Sat, 21 Feb 2026 06:21:57 +0000</pubDate>
      <link>https://dev.to/uvsmtid/from-shell-to-python-what-stops-you-3ifo</link>
      <guid>https://dev.to/uvsmtid/from-shell-to-python-what-stops-you-3ifo</guid>
      <description>&lt;p&gt;&lt;code&gt;shell&lt;/code&gt; scripts are a poor choice for evolving software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ❌ (unit) test code for &lt;code&gt;shell&lt;/code&gt; scripts is near zero&lt;/li&gt;
&lt;li&gt;  ❌ no default error detection (forget &lt;code&gt;set -e&lt;/code&gt; and an undetected disaster bubbles through the call stack)&lt;/li&gt;
&lt;li&gt;  ❌ cryptic "write-only" syntax (e.g. &lt;code&gt;echo "${file_path##*/}"&lt;/code&gt; vs &lt;code&gt;os.path.basename(file_path)&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;  ❌ subtle, error-prone pitfalls (e.g. &lt;code&gt;shopt&lt;/code&gt; nuances)&lt;/li&gt;
&lt;li&gt;  ❌ unpredictable local/user overrides (e.g. PATH points to unexpected binaries)&lt;/li&gt;
&lt;li&gt;  ❌ less cross-platform than it seems even on *nixes (e.g. divergent command behaviors: macOS vs Linux)&lt;/li&gt;
&lt;li&gt;  ❌ no stack traces on failure (which encourages noisy, excessive logging instead)&lt;/li&gt;
&lt;li&gt;  ❌ limited native data structures (no nested ones)&lt;/li&gt;
&lt;li&gt;  ❌ no modularity (code larger than one-page-one-file is cumbersome)&lt;/li&gt;
&lt;li&gt;  ❌ no external libraries/packages (no enforce-able dependencies)&lt;/li&gt;
&lt;li&gt;  ❌ when shell scripts multiply, they inter-depend for reuse (by source-ing) into an entangled mess&lt;/li&gt;
&lt;li&gt;  ❌ being so unpredictable makes shell scripts high security risks&lt;/li&gt;
&lt;li&gt;  ❌ slow&lt;/li&gt;
&lt;li&gt;  ...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not get me wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  We might be &lt;code&gt;shell&lt;/code&gt; champions to abuse it beyond its limits to get sh*t done.&lt;/li&gt;
&lt;li&gt;  But others may want to help too - instead, they drown in &lt;code&gt;shell&lt;/code&gt; hell.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why not &lt;code&gt;python&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;The main reason I used to resort to &lt;code&gt;shell&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The need for the extra “body movements” to provide required python, populate the &lt;code&gt;venv&lt;/code&gt; and activate it.&lt;/li&gt;
&lt;li&gt;  Automating this for any environment immediately adds wrappers which are likely &lt;code&gt;shell&lt;/code&gt; scripts &lt;strong&gt;anyway&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to fix all this?
&lt;/h2&gt;

&lt;p&gt;One attempt is:&lt;br&gt;
&lt;a href="https://github.com/uvsmtid/protoprimer" rel="noopener noreferrer"&gt;https://github.com/uvsmtid/protoprimer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;an &lt;strong&gt;argless&lt;/strong&gt; reusable &lt;strong&gt;one-liner&lt;/strong&gt; to bootstrap the environment with (almost) &lt;strong&gt;zero&lt;/strong&gt; pre-requisites that runs &lt;strong&gt;everywhere&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./prime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; takes off with a &lt;strong&gt;wild&lt;/strong&gt; &lt;code&gt;python&lt;/code&gt; version (whatever is in $PATH)&lt;/li&gt;
&lt;li&gt; switches it in-flight to the &lt;strong&gt;required&lt;/strong&gt; &lt;code&gt;python&lt;/code&gt; version&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;hands over&lt;/strong&gt; inside a comfy isolated &lt;code&gt;venv&lt;/code&gt; with all dependencies pinned&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How would you deal with it otherwise?
&lt;/h2&gt;

</description>
      <category>python</category>
      <category>devops</category>
      <category>discuss</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
