# The Linux / Unix operating system¶

## Shells¶

A shell is a program that allows you to interact with the operating system. In this class you will mainly use the BASH shell. You are probably already familiar with the Matlab shell (or ‘’Matlab command window’’ if you are using a GUI version of Matlab.)

In the shell you will have a prompt (usually denoted by $ or >>) where you can type in commands to the operating system. For example if you have forgotten, you can ask $ whoami. There are other commands that are a bit more useful:

### pwd, cd, mkdir, ls¶

The command pwd prints the working directory, i.e. where your prompt is located in the directory structure. If you want to change the directory you use cd. For example if I am stainding in /home/appelo/ and want to change to /home/appelo/repos/math471 I would just type $cd repos and then $ cd math471 or alternatively I could type $cd repos/math471 and change two levels at one. The command cd (and most other commands) can take a relative (as above) or absolute path. The absolute path starts from the root directory / so we could also type $ cd /home/appelo/repos/math471 with the same result as above. If you want to go up (towards the root) you can use $cd .. which brings you up one level. If you need to make a new directory use $ mkdir dir_name.

A very useful command is ls which lists files and directories

$ls README.rst notes slides  The command ls can be executed with a lot of different flags (see man ls), I find the flags -ltr which provides a long listing with the latest modified file/directory at the bottom: $ls -ltr
total 8
-rw-r--r--   1 appelo  staff  451 Aug  4 16:04 README.rst
drwxr-xr-x  10 appelo  staff  340 Aug 18 08:59 slides
drwxr-xr-x  21 appelo  staff  714 Aug 18 15:28 notes


These commands also come with many options, for example if you want to copy a directory and all its sub-directories you will have to use the flag -r, that is: $cp -r odir cdir. The move command mv works very much like the copy command. To remove files the command to use is rm, again with the option to be executed with flags such as -f for force or -r for descending into sub-directories. ## Logging in to a remote computer¶ To login to a remote computer you can use the secure shell, for example to login to linux.unm.edu you would type: ssh -X appelo@linux.unm.edu  Here the -X starts the X-server so you can open windows locally on your machine. The result of the above command is the following (angry) message ======================================================================== = WARNING NOTICE TO USERS = = Authorized uses only. = = All activity may be monitored and reported. = ======================================================================== appelo@linux.unm.edu's password: Last login: Wed Aug 21 15:54:53 2013 from valhall.math.unm.edu --------------------------------------- linux.unm.edu ftp.unm.edu --------------------------------------- Popular Packages: SAS 9.2 | Matlab R2011a | Maple v12 | Subversion 1.6 Java 1.6 | PINE: ALPINE (which is PINE) GCC, G++ and GNU Fortran, Ruby, Perl, Python, GNU assembler  ## Environment variables¶ The bash shell uses environment variables to keep track of various information. These can be displayed by the command printenv or simply env. Executing this may give an output that looks something like this: [appelo@mizar ~]$ printenv
HOSTNAME=mizar.unm.edu
SHELL=/bin/bash
USER=appelo
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/nfs/user/a/appelo/bin
PWD=/nfs/user/a/appelo
HOME=/nfs/user/a/appelo
LOGNAME=appelo
_=/usr/bin/printenv


The environment variables can be accessed through the dollar sign, for example ls -ltr $PWD would list the content of the current directory. The underscore environment variable holds the last command you executed and can be useful, if you don’t want to type in a long command again just type $_.

## The search path¶

The variable PATH is a list of the directories where the shell searches for the commands you are trying to execute. So if you install some software in a new location, say HOME/newbin, you may want to append PATH by using the export command

export PATH=$PATH:$HOME/newbin


The search paths are separated by a colon. If you want the added directory to be searched first you can prepend the PATH instead

export PATH=$HOME/newbin:$PATH


## The .bashrc file¶

Whenever you open a new terminal the file \$HOME/.bashrc is executed so if you always want to append the PATH variable or do other permanent changes you can add them to the .bashrc file. For example you can redefine ls to color the output by adding the line alias ls='ls -G'.

A good resource for reading more about shells and Linux/Unix is software-carpentry.