Bish bosh bash. Why do lots of boring tasks when they could be automated? Bash something out instead.
Why?
A lot of Linux scripts are written in Bash, and an understanding of it helps in other areas, such as piping (|) and outputting (>) in npm scripts.
How?
Using the built in commands as covered in terminal velocity we can start to pull sequences of commands together in one nice little script. It can be more than running sequentially through commands; you can use it with variables, getting user input, loops, sub scripts et al.
A great thing about bash scripts is that they don't have to be compiled, it is right there part of the OS.
To enter bash type bash
in the terminal. You'll see something like bash-3.2$
.
Then you can run commands directly with bash:
echo hello world
Bash is more useful in a script. Create a file (vim hello) add echo hello world
and save as 'hello' (no file extension). Navigate to the directory and run:
bash hello
hello world
Unix has a standard i/o (input output) model consisting of:
- standard input
- standard output
- standard error
Input could be a mouse or something else but it defaults to keyboard. Output could be a printer or something else but it defaults to a console/screen/monitor. Error is like output, it defaults to console/screen/monitor.
These are also streams, and like streams they can be channelled and redirected. To redirect output into a file (using standard output >
):
ls -la > listoutputfile.txt
If there is an error, you can write out the error to a file using the standard error output 2>
;
ls -la not.here 2> lserror.txt
I used to use the > when backing up a MySQL database without really understanding what it was:
mysqldump --opt -u root -p mydatabase > mbackupfile.sql
To redirect output as input to another script use the pipe |
. For example, to get a list of files (recursive) in a directory you can use find
and then pipe it into wc
which stands for word count:
find . -type f | wc -l
Running scripts
The easiest way to run your script is to run from it's directory using the bash command:
bash ./myscript
If you want your script to be available on your system, you can either add it to the $PATH or you can move it to /usr/local/bin
To turn your script into an executable run:
chmod +x myscript
And run it with:
./myscript
More on Unix permissions can be found at linuxcommand.org.
If you try to run it with just myscript
you will get a 'command not found' error. This is because bash will look in the /usr/local/bin
for the executable, hence we have to explicitly say that the script is here.
.bashrc refresh/reload
If you edit your .bashrc file and you want to apply those changes without logging off and back on again just run:
. ~/.bashrc
or
source ~/.bashrc
Bash scripting is really powerful. Definitely worth investing some time in it.