Shell tools/extensions you might want

Here are some tools and extensions that I use in my shell. They’re not necessarily related to data science/development, but useful nonetheless.

  • ShellCheck will find bugs in your shell scripts and make them pretty
  • DirEnv will load and unload environment variables depending on the current directory
  • tldr.sh will show you simplified man pages
  • Attercop will generate shell commands from natural language, using the OpenAI API (yup, GPT-3 to the rescue)
  • jdupes is powerful duplicate file finder and an enhanced fork of ‘fdupes’.

General

Speed up new terminals being slow

In my case it was __conda_setup, apparently this is the cause:

A TL;DR as this is currently the first hit on Google: the problem is that the NotImplementedError() raised in conda/activate.py takes a long time to pop up in some configurations.

This worked for me:

conda config --set auto_activate_base false

– via this GitHub issue

Exec a command over all files of a certain type (or that fulfill certain criteria)

# Find all files with a .txt extension and execute a echo on them
find . -name "*.txt" -exec echo {} \;

– via Baeldung

Remove double quotes characters surrounding text

Two approaches:

text="\"hello world\""

# 1. Using sed, this doesn't look nice but will work as expected and will only remove surrounding quotes
sed -e 's/^"//' -e 's/"$//' <<<"$text"

# 2. Using tr, this looks way nicer but will also remove quotes from the middle of the text
echo "$text" | tr -d '"'

# 3. Using cut which was recommended to me by Copilot and, surprisingly, it works
cut -d '"' -f2 <<<"$text"

– via Stack Overflow

Use and format current date in scripts

# Pretty month and day - "February_03"
echo "$(date '+%B_%d')"

# Standard date format - "2023-02-03"
echo "$(date '+%Y-%m-%d')"

– via Stack Overflow

Zsh

Enable AZ CLI autocomplete in Zsh

If you don’t have the Bash autocomplete script available at /usr/local/etc/bash_completion.d/az, make sure to download it from here.

Then include the following lines in your .zshrc, after sourcing oh-my-zsh.sh.

# Enable bash autocompletions in zsh
autoload -U +X bashcompinit && bashcompinit

# Enable the completions
source /usr/local/etc/bash_completion.d/az

– via Stack Overflow and MyDiemHo

Prevent issues with brackets in commands

If you’re using Zsh and you’re getting errors like zsh: no matches found: pip install fuzzy[optional], you can either prefix the entire command with noglob or surround the bit with the brackets with single quotes.

noglob pip install fuzzy[optional]

pip install 'fuzzy[optional]'

SSH

Download one or more files to your local machine via SSH

Use scp.

# Download single file
local> scp username@host.com:/path/to/dir/file local/path 

# Download directory recursively
local> scp -r username@host.com:/path/to/dir local/path 

– via Stack Overflow

Create a script that runs over SSH

Basic script

ssh <your-server> << EOF
    echo "Hello world"
    echo "This is where your script should be"
EOF

– via Amit Chaudhary

Displaying the ssh command outputs and avoiding the “Pseudo-terminal will not be allocated because stdin is not a terminal.” warning

ssh <your-server> -tt << EOF
    echo "Hello world"
    echo "This is where your script should be"
EOF

– via Stack Overflow

Bonus: Setting up a ssh key for passwordless auth

ssh-keygen -t rsa -b 2048

ssh-copy-id id@server -i <path_to_your_new_key>

ssh id@server  -i <path_to_your_new_key>

I’m including the path to the new key since I’m using a dedicated, passwordless key for this specific instance. If you’re just setting up the default key (~/.ssh/id_rsa) then you won’t need the -i option.

– via Stack Overflow

Grepping a text file with Windows line endings

tr '\r' '\n' < info.csv | grep "42"

Load environment variables from .env file in Bash

 export $(cat .env | xargs)

– via @mihow