Page 1 of 1

A crash course in Bash Productivity Rate Topic: -----

#1 G0rman   User is offline

  • New D.I.C Head
  • member icon

Reputation: 7
  • View blog
  • Posts: 46
  • Joined: 16-October 11

Posted 25 September 2012 - 09:56 AM

Bash has a lot of very useful commands. Utilizing these commands is the key to productivity.
I will attempt to show each command or sequence in context, so you can see both how it works and what it does, and in which situation it is useful. I will comment after commands to tell you what they do whenever appropriate. Some of this stuff you will already know, veterans will probably know all of this already. However this is stuff I use on a daily basis, and I think everyone would benefit from knowing it.

Hold on, because we are going to cover a lot of ground!
$ pwd	# displays the current directory
$ cd	# calling cd without any args will change to your home directory
$ pwd
$ cd -	# calling cd with the arg - will change to your previous directory
$ ls -la	# you don't need seperate "-" for each argument
drwxr-xr-x  2 gorman gorman 4096 Sep 25 23:11 .
drwxrwxrwt 12 root   root   4096 Sep 25 23:11 ..
$ ps a		# programs that don't take arguments don't even need the "-"
 8854 pts/1    RN+    0:00 ps a
$ mkdir test
$ cd !^		# in bash "!" means "command", "^" means "first argument of"
		# thus this says "cd last command's first argument"
cd test		# which would be "cd test"
		# you will also notice that when using shorthand like this
		# bash will print the expanded command
$ touch a	# touch is a quick and easy way to create files
		# if the file already exists it won't even throw an error
$ echo "Hello, world" >> a	# quick and easy write to file
$ cat !$	# "!^" means "first argument", "!$" means last argument
cat a
Hello, world
$ cp !$ b
cp a b
$ echo "Goodbye, world" >> !$
$ history 3	# history will display the last n commands
 2083  cp a b
 2084  echo "Goodbye, world" >> b
 2085  history 2
$ cat !2083*	# "!" is command, so "!2084" means command number 2084
		# the "*" means "all args"
cat a b
Hello, world
Goodbye, world
$ !!:s/b/a/	# "!!" means "previous command with all args"
		# ":s/b/a/" means "replace all instances of "b" with "a"
cat a a
Hello, world
Hello, world
$ !2083:s/b/a/	# of course, we can do the same with history too
cat a a
Hello, world
Hello, world
$ ^ a^ b^	# this is shorthand for shorthand - it means
		# replay last command with all " a" substitited with " b"
cat b b
Goodbye, world
Goodbye, world
$ !-2		# run the command 2 commands ago
cat a a
Hello, world
Hello, world
$ echo !#	# "!#" means "whatever has been typed before this"
echo echo	# Here it is printing the command
echo		# and here it is echoing echo, as the command says!
		# I'll admit, I never used !# in a useful situation...
$ cd ..		# go to the current directory's parent
$ ls
$ mkdir test	# mkdir on a directory that already exists
mkdir: cannot create directory `test': File exists
$ mkdir test 2>/dev/null	# redirect "2", stderror, to /dev/null; aka the black hole
				# we don't get an error message now!
$ hostname	# what box am I on?
$ ssh [email protected]		# just sshing in to a box like normal
password:						# typing passwords is so tedious!
Last login: Tue Sep 25 12:23:30 2012 from	# let's set up automatic logon
$ exit							# time to put our skills to the test!
Connection to was closed.
$ alias sshhost="!!"	# we will need to SSH there again, so let's alias it
$ cd
$ mkdir .ssh 2>/dev/null
$ cd !^
cd .ssh
$ ssh-keygen -t rsa	# make an RSA key
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gorman/.ssh/id_rsa): 
Created directory '/home/gorman/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/gorman/.ssh/id_rsa.
Your public key has been saved in /home/gorman/.ssh/
The key fingerprint is:
01:23:45:67:89:ab:cd:ef:ed:cb:a9:87:65:43:21:01 [email protected]
$ sshhost mkdir -p .ssh		# that alias came in handy, let's make the directory on the server
password:			# not enjoying all these passwords... soon I won't need to type them
$ cat | sshhost 'cat >> .ssh/authorized_keys' # cat that key and send it right across
password: 			# this is the last time I need to type that sucker!
$ sshhost
Last login: Tue Sep 25 23:50:58 2012 from	# success!
$ pwd
$ echo "alias sshlocal='ssh'" >> .bashrc
	# .bashrc is a very useful file to add aliases to
	# alternately you can make a seperate aliases file and have .bashrc call that
$ exit
$ echo "`alias sshhost`" >> .bashrc	# surrounding a statement with ` ` make it execute
					# this code will echo the sshhost alias and add it to .bashrc
					# very useful for adding a temporary alias to your permanent list
Connection to closed.
$ scp .aliases	# let's copy my aliases over
.aliases                                       100% 4430     4.3KB/s   00:00
$ sshhost
Last login: Tue Sep 25 23:53:58 2012 from
$ chmod +x .aliases		# make aliases runnable
$ echo "~/$!" >> .bashrc        # tell it to call my aliases
echo "~/.aliases" >> .bashrc
$ cat .aliases			# this is what is in my aliases
alias ll='ls -alF'		# ls everything with a lot of information
alias la='ls -A'		# ls everything
alias l='ls -CF'		# quick ls with the trailing / on directories

alias lr='ls -la | grep [r-][w-][x-][r-][w-][x-]r[w-][x-]'	# shows me everything readable by all
alias lw='ls -la | grep [r-][w-][x-][r-][w-][x-][r-]w[x-]'	# everything writeable by all
alias lx='ls -la | grep [r-][w-][x-][r-][w-][x-][r-][w-]x'	# everything executable by all
								# yes, the regex could be improved :)

alias hd='hexdump'	# because my fingers get tired when I type more than 2 chars
alias tree="ls -R 2>/dev/null | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//  /g' -e 's/^/   /' -e 's/ /|/'"		# I can't always install my own programs, so this emulates tree
alias boxes='ssh "netstat -T | grep \"box[^ :]*\" -o " | uniq | sort'	# sometimes I want to know which boxes are onlineline. Naturally all boxes have an open connection to the print server.
$ cd bin	# Every user should have a bin directory somewhere, I keep my in home
$ ls		# this is where all the fun scripts go
portscanner	# a mass port scanner utility
dist		# runs a single command on all boxes online
$ cd
$ echo "PATH=$PATH:$HOME/bin" >> .bash_profile	# need to add bin to my path so I can run dist without
 						# having to write "~/bin/dist"
$ logout
Connection to closed
$ logout
Connection to closed

Useful hotkeys
TAB autocomplete - will try and complete a command or input.
example: type "ech" and press tab
CTRL+R reverse command search - searches your history for the last usage of a string.
example: press CTRL+R then type "cd "
CTRL+A go to the begining of line
CTRL+E go to the end of the line
CTRL+U clear line after cursor
CTRL+K clear line before cursor
ESC+T swap the last 2 words before the cursor
example: type "chmod file +x" then hit ESC+T
CTRL+L clear the screen
UP previous command
DOWN next command
CTRL+C kill current process
CTRL+Z suspend current process
CTRL+D disconnect from current session
equivilent to logout command
CTRL+LEFT move left by one word
CTRL+RIGHT move right by one word

Other useful commands
piping a command into less gives you an easy way to read large blocks of text
example: cat a large file in to less; “cat BIGFILE | less”

sends a process to the background

brings a process to the foreground

stops a process for exiting when you disconnect
example: "./", suspend with CTRL+Z, use "bg" to send it to background
then use "disown" to stop it dieing when you disconnect

constantly prints out "y"
if you have something that needs confirmation you can pipe yes in to it to prevent it hanging

opens the manual page for a command
example: man history

There are many guides on hotkeys and useful commands, this is not comprehensive, this is just what I use the most. For further reading consult google, and the man pages. Especially the man page for history.

Good practices
Every time you type a command, it takes some thought, especially the big pipe lines like ls -R 2>/dev/null | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /' -e 's/ /|/' Could you remember what that does? Could you remember the correct syntax? Aliases are super important. If you run a command more than twice, alias it in the local terminal. If you use it a few more times, add it to your .bashrc or .aliases
Every time you have to think about "oh how did I do that nice tree thing" you lose some focus on the task at hand. Your aliases are your weapons, and your bin directory is your artillery. Any useful script file should be chucked in there. A good arsenal makes any programmer more efficient.
Personally I divide my scripts in to finished polished scripts, these go in bin. My unfinished hackjobs go in a different directory. I usually have to have a --usage message, and proper argument parsing before I consider a script good enough for bin.

Naturally this is all my opinion, but hopefully you can find something within this crash course which you can apply to your workflow.

Is This A Good Question/Topic? 4
  • +

Replies To: A crash course in Bash Productivity

#2 GodinHell   User is offline

  • D.I.C Head

Reputation: 2
  • View blog
  • Posts: 51
  • Joined: 06-September 11

Posted 30 September 2012 - 01:25 PM

I google for that :-
Was This Post Helpful? 2
  • +
  • -

Page 1 of 1