Shell Tricks: quick start scripts

Here’s another little Bash function. It makes it possible to create a new script in one command, creating the file with shebang, making it executable, and opening it in your editor.

Just run newscript scriptname.rb to create a new ruby script with a /usr/bin/env ruby shebang. It also recognizes Python, Perl, and bash extensions, add more as needed.

You can also create a directory with “skeleton” scripts. If you have a list of includes that you always use in your shell scripts, add a ext.txt file to that directory (e.g. rb.txt or py.txt). By default that directory is ~/.newscript_defaults, but you can modify it in the config section. As an example, you might have a sh.txt file that sources a file of common functions you use in bash scripts, or an rb.txt file that includes contains # encoding: utf-8 to be appended after the shebang.

Just add this to ~/.bash_profile, or wherever you source your shell functions from. You’ll need to edit your script location in the scriptdir variable at the top.

newscript.bashraw
# Touch, make executable and start editing a new script
# $ newscript my_new_script.sh
# edit default shebangs within the function
# include additional skeleton files as [extension].txt
# in the $defaults_txt folder defined in config
newscript() {
	# Config
	# where your scripts are stored
	local scriptdir=~/scripts/
	# if no extension is provided, default to
	local default_ext=rb
	# optional, where skeleton scripts (e.g. rb.txt) are stored
	local defaults_txt=~/.newscript_defaults/
	# End config
	local filename="${scriptdir%/}/$1"

	if [[ $# == 0 ]]; then # no argument, display help and exit
		echo -e "newscript: touch, make executable and \
start editing a new script.\n\033[31;1mError:\033[37;1m Missing filename\033[0m\n\n\
Usage: mynewscript SCRIPT_NAME.ext\n"
		return 1
	fi
	# get the extension from the filename
	ext=${filename#*.}
	# if there's no extenstion, add default
	if [[ $ext == $filename ]]; then
		ext=$default_ext
		filename=$filename.$ext
	fi
	# if no script with this name already exists
	if [ ! -f $filename ]; then

		# create a file for the given extension with appropriate shebang
		case $ext in
			rb ) echo -e "#!/usr/bin/env ruby" >> $filename;;
			py ) echo -e "#!/usr/bin/env python" >> $filename;;
			pl ) echo -e "#!/usr/bin/env perl" >> $filename;;
			sh | bash ) echo -e "#!/bin/bash" >> $filename;;
			zsh | bash ) echo -e "#!/bin/zbash" >> $filename;;
			 * ) touch $filename;; # any other extension create blank file
		esac
		# if skeleton files directory and a txt for the given extension exist
		if [[ -d ${defaults_txt%/} && -f ${defaults_txt%/}/$ext.txt ]]; then
			# concatenate it to the file
			cat ${defaults_txt%/}/$ext.txt >> $filename
		fi
		# Add trailing newline to the new script
		echo -ne "\n" >> $filename
		# Make it executable
		chmod a+x "$filename"
		echo -e "\033[32;1m$filename\033[0m"
	else # Specified filename already exists
		echo -e "\033[31;1mFile exists: $filename\033[0m"
	fi
	# Edit the script
	$EDITOR "$filename"
}

Neat.

Ryan Irelan has produced a series of shell trick videos based on BrettTerpstra.com posts. Readers can get 10% off using the coupon code TERPSTRA.

Brett Terpstra

Brett is a writer and developer living in Minnesota, USA. You can follow him as ttscoff on Twitter, GitHub, and Mastodon. Keep up with this blog by subscribing in your favorite news reader.

This content is supported by readers like you.