<?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: Lud</title>
    <description>The latest articles on DEV Community by Lud (@swiknaba).</description>
    <link>https://dev.to/swiknaba</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%2F103953%2F4bfb1650-4535-411b-b6db-1a61bb1f77f2.jpg</url>
      <title>DEV Community: Lud</title>
      <link>https://dev.to/swiknaba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/swiknaba"/>
    <language>en</language>
    <item>
      <title>How to organize your bash profile</title>
      <dc:creator>Lud</dc:creator>
      <pubDate>Sun, 08 Nov 2020 15:35:24 +0000</pubDate>
      <link>https://dev.to/swiknaba/how-to-organize-your-bash-profile-20eb</link>
      <guid>https://dev.to/swiknaba/how-to-organize-your-bash-profile-20eb</guid>
      <description>&lt;p&gt;For many years, I've treated my bash profile as some alien part on my computer. Over time, I hacked together quite some aliases for often-used commands and just shoved them into this mysterious file.&lt;/p&gt;

&lt;p&gt;I recently moved to a new computer and started migrating my data, including my shell shortcuts. Opening them in Atom to cherry-pick what I want to migrate, it dawned on me that my bash profile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is just code, the same I write day in day out, nothing alien or mysterious at all (a different language, though)&lt;/li&gt;
&lt;li&gt;is a total mess&lt;/li&gt;
&lt;li&gt;is badly coded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hence, I thought, why not treat my bash profile the same way, like any other project? This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a proper structure&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;linting&lt;/li&gt;
&lt;li&gt;reviewing&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So here is what I came up with:&lt;/p&gt;

&lt;p&gt;I created a new GitHub repository named &lt;code&gt;.bashrc.d&lt;/code&gt; and cloned it to my home folder (after some research, I found that this folder naturally exists on some Linux distros, but not on macOS; thus, I choose this name):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git clone https://github.com/swiknaba/.bashrc.d.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the folder structure there is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.bashrc.d
│   README.md  
│
└───.github
│   └───workflows
│       │   shell_lint.yml
│   
└───src
│   └───projects
│       │   project_1.bashrc
│       │   project_2.bashrc
    │   constants.bashrc
    │   git.bashrc
    │   paths.bashrc
    │   ruby_on_rails.bashrc
    │   utilities.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to load all these files in our &lt;code&gt;.bash_profile&lt;/code&gt;, luckily that is pretty simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# https://github.com/koalaman/shellcheck/wiki/SC2044&lt;/span&gt;
&lt;span class="nb"&gt;shopt&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; globstar nullglob
&lt;span class="k"&gt;for &lt;/span&gt;file &lt;span class="k"&gt;in&lt;/span&gt; ~/.bashrc.d/src/&lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.bashrc
&lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So all I have to do is copy-paste this into my new computer's bash profile, then clone my repo, and finally give all files the correct permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 700 ~/.bashrc.d
find ~/.bashrc.d/src &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.bashrc'&lt;/span&gt; | xargs &lt;span class="nb"&gt;chmod&lt;/span&gt; +x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During re-writing all my bash scripts, I realized macOS ships with Bash version 3, which seems to be due to licensing issues. I've upgraded that to Bash 5, which is very straightforward; you can use homebrew for that. Upgrading Bash gives us shiny new features and overall improvements. Looping over files became so much shorter! 🚀&lt;/p&gt;

&lt;p&gt;Many shortcuts in my bash profile are specific to projects that I am working on, so I cannot share the repo with you. However, I can share some parts of it here, in case you are interested in cleaning up and organizing your bash profile, too!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/shell_lint.yml&lt;/span&gt;

&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ShellLint&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;main&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="c1"&gt;# Lint bash scripts&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Shell Linter&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;azohra/shell-linter@v0.4.0&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/*.bashrc,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;src/**/*.bashrc"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, the above-mentioned &lt;code&gt;src/constants.bashrc&lt;/code&gt; contains stuff like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# set default terminal-editor to nano&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nano
&lt;span class="nv"&gt;VISUAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EDITOR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;VISUAL
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BUNDLER_EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;atom

&lt;span class="c"&gt;# ignore consecutive duplicates when running `history` in bash&lt;/span&gt;
&lt;span class="nv"&gt;HISTCONTROL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ignoredups
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;paths.bashrc&lt;/code&gt; file hosts all these &lt;code&gt;export PATH=/usr/...&lt;/code&gt; that so many tools shove into your bash profile.&lt;/p&gt;

&lt;p&gt;And so forth. I think you get the idea!&lt;/p&gt;

&lt;p&gt;Now that I've moved my bash profile to GitHub, I also opened my first issue: Write tests using shUnit2. Let's see, when I find motivation for that 😄&lt;/p&gt;

&lt;p&gt;(How) do you organize code on your machine that is solely in your hands, not peer-reviewed by anyone?&lt;/p&gt;

</description>
      <category>bash</category>
      <category>tips</category>
      <category>commandline</category>
    </item>
  </channel>
</rss>
