Contents
These days many people use computers with a graphical user interface (GUI) like KDE or GNOME. Although they offer lots of features, their use is limited when it comes to the execution of automatical tasks. Shells are a good addition to GUIs and this chapter gives you an overview of some aspects of shells, in this case Bash.
Traditionally, the shell is Bash (Bourne again Shell). When this chapter speaks about “the shell” it means Bash. There are actually more available shells than Bash (ash, csh, ksh, zsh, …), each employing different features and characteristics. If you need further information about other shells, search for shell in YaST.
A shell can be invoked as an:
interactive login shell. This is used when logging in to a machine,
invoking Bash with the --login
option or when logging
in to a remote machine with SSH.
“ordinary” interactive shell. This is normally the case when starting xterm, konsole, gnome-terminal or similar tools.
non-interactive shell. This is used when invoking a shell script in the commandline.
Depending on which type of shell you use, different configuration files are being read. The following tables show the login and non-login shell configuration files.
Table 22.1. Bash Configuration Files for Login Shells¶
File |
Description |
---|---|
|
Do not modify this file, otherwise your modifications can be destroyed during your next update! |
|
Use this file if you extend |
|
Contains system-wide configuration files for specific programs |
|
Insert user specific configuration for login shells here |
Table 22.2. Bash Configuration Files for Non-Login Shells¶
|
Do not modify this file, otherwise your modifications can be destroyed during your next update! |
|
Use this file to insert your system-wide modifications for Bash only |
|
Insert user specific configuration here |
Additionally, Bash uses some more files:
Table 22.3. Special Files for Bash
File |
Description |
---|---|
|
Contains a list of all commands you have been typing |
|
Executed when logging out |
The following table provides a short overview of the most important higher-level directories that you find on a Linux system. Find more detailed information about the directories and important subdirectories in the following list.
Table 22.4. Overview of a Standard Directory Tree
Directory |
Contents |
---|---|
Root directory—the starting point of the directory tree. | |
Essential binary files, such as commands that are needed by both the system administrator and normal users. Usually also contains the shells, such as Bash. | |
Static files of the boot loader. | |
Files needed to access host-specific devices. | |
Host-specific system configuration files. | |
Holds the home directories of all users who have accounts on the
system. However, | |
Essential shared libraries and kernel modules. | |
Mount points for removable media. | |
Mount point for temporarily mounting a file system. | |
Add-on application software packages. | |
Home directory for the superuser | |
Essential system binaries. | |
Data for services provided by the system. | |
Temporary files. | |
Secondary hierarchy with read-only data. | |
Variable data such as log files. | |
Only available if you have both Microsoft Windows* and Linux installed on your system. Contains the Windows data. |
The following list provides more detailed information and gives some examples of which files and subdirectories can be found in the directories:
/bin
Contains the basic shell commands that may be used both by root
and by other users. These commands include ls,
mkdir, cp, mv,
rm and rmdir.
/bin
also contains Bash, the default shell in
openSUSE.
/boot
Contains data required for booting, such as the boot loader, the kernel, and other data that is used before the kernel begins executing user-mode programs.
/dev
Holds device files that represent hardware components.
/etc
Contains local configuration files that control the operation of
programs like the X Window System. The /etc/init.d
subdirectory contains scripts that are executed during the boot
process.
/home/username
Holds the private data of every user who has an account on the system.
The files located here can only be modified by their owner or by the
system administrator. By default, your e-mail directory and personal
desktop configuration are located here in the form of hidden files and
directories. KDE users find the personal configuration data for their
desktop in .kde4
and GNOME users find it in
.gconf
.
Home Directory in a Network Environment | |
---|---|
If you are working in a network environment, your home directory may
be mapped to a directory in the file system other than
|
/lib
Contains the essential shared libraries needed to boot the system and to run the commands in the root file system. The Windows equivalent for shared libraries are DLL files.
/media
Contains mount points for removable media, such as CD-ROMs, USB sticks
and digital cameras (if they use USB). /media
generally holds any type of drive except the hard drive of your system.
As soon as your removable medium has been inserted or connected to the
system and has been mounted, you can access it from here.
/mnt
This directory provides a mount point for a temporarily mounted file
system. root
may mount file systems here.
/opt
Reserved for the installation of third-party software. Optional software and larger add-on program packages can be found here.
/root
Home directory for the root
user. The personal data of root
is located here.
/sbin
As the s
indicates, this directory holds utilities
for the superuser. /sbin
contains the binaries
essential for booting, restoring and recovering the system in addition
to the binaries in /bin
.
/srv
Holds data for services provided by the system, such as FTP and HTTP.
/tmp
This directory is used by programs that require temporary storage of files.
Cleaning up /tmp at Boot Time | |
---|---|
Data stored in |
/usr
/usr
has nothing to do with users, but is the
acronym for UNIX system resources. The data in
/usr
is static, read-only data that can be shared
among various hosts compliant with the Filesystem Hierarchy Standard
(FHS). This directory contains all application programs and establishes
a secondary hierarchy in the file system. KDE4 and GNOME are also
located here. /usr
holds a number of
subdirectories, such as /usr/bin
,
/usr/sbin
, /usr/local
, and
/usr/share/doc
.
/usr/bin
Contains generally accessible programs.
/usr/sbin
Contains system daemons and programs reserved for the system administrator that are not essential for booting the system.
/usr/local
In this directory the system administrator can install local, distribution-independent extensions.
/usr/share/doc
Holds various documentation files and the release notes for your
system. In the manual
subdirectory find an online
version of this manual. If more than one language is installed, this
directory may contain versions of the manuals for different languages.
Under packages
find the documentation included in
the software packages installed on your system. For every package, a
subdirectory
/usr/share/doc/packages/
is created that often holds README files for the package and sometimes
examples, configuration files or additional scripts.
packagename
If HOWTOs are installed on your system
/usr/share/doc
also holds the
howto
subdirectory in which to find additional
documentation on many tasks related to the setup and operation of Linux
software.
/var
Whereas /usr
holds static, read-only data,
/var
is for data which is written during system
operation and thus is variable data, such as log files or spooling
data. For an overview of the most important log files you can find
under /var/log/
, refer to
Tabelle „Protokolldateien“ (↑Start-Up).
/windows
Only available if you have both Microsoft Windows and Linux installed on your system. Contains the Windows data available on the Windows partition of your system. Whether you can edit the data in this directory depends on the file system your Windows partition uses. If it is FAT32, you can open and edit the files in this directory. For NTFS, openSUSE also includes write access support. However, the driver for the NTFS-3g file system has limited functionality. Learn more in Section 37.4, “Accessing Files on Different OS on the Same Computer”.
Shell scripts are a convenient way of doing all sorts of tasks: collecting data, searching for a word or phrase in a text and many other useful things. The following example shows a small shell script that prints a text:
Example 22.1. A Shell Script Printing a Text
#!/bin/sh # Output the following line: echo "Hello World"
Before you can run this script you need some prerequisites:
Every script should contain a Shebang line (this is already the case with our example above). If a script does not have this line, you have to call the interpreter manually.
Save the script to a directory where the shell can find it. The search
path in a shell is determined by the environment variable
PATH
. Usually a normal user does not have write access
to /usr/bin
. Therefore, it is recommended to save
your scripts in the users' directory ~/bin/
. The
above example gets the name hello.sh
.
The script needs executable permissions. Set the permissions with the following command:
chmod +x ~/bin/hello.sh
If you have fulfilled all of the above prerequisites, you can execute the script in the following ways:
As Absolute Path. The script can be executed with an absolute path. In our case, it is ~/bin/hello.sh.
Everywhere.
If the PATH
environment variable contains the directory
where the script is located, you can execute the script just with
hello.sh.
Each command can use three channels, either for input or output:
Standard Output. This is the default output channel. Whenever a command prints something, it uses the standard output channel.
Standard Input. If a command needs input from users or other commands, it uses this channel.
Standard Error. Commands use this channel for error reporting.
To redirect these channels, there are the following possibilities:
Command > File
Saves the output of the command into a file, an existing file will be
deleted. For example, the ls command writes its
output into the file listing.txt
:
ls > listing.txt
Command >> File
Appends the output of the command to a file. For example, the
ls command appends its output to the file
listing.txt
:
ls >> listing.txt
Command < File
Reads the file as input for the given command. For example, the
read command reads in the content of the file to
the variable a
:
read a < foo
Command1 | Command2
Redirects the output of the left command as input for the right
command. For example, the cat command outputs the
content of the /proc/cpuinfo
file. This output is
used by grep to filter only those lines which
contain cpu
:
cat /proc/cpuinfo | grep cpu
Every channel has a file descriptor: 0 (zero) for
standard input, 1 for standard output and 2 for standard error. It is
allowed to insert this file descriptor before a <
or >
character. For example, the following line
searches for a file starting with foo
, but
suppresses its errors by redirecting it to
/dev/null
, the garbage bin:
find / -name "foo*" 2>/dev/null
An alias is a shortcut definition of one or more commands. This is useful if you have commands which are hard to remember or with lots of options. The syntax for an alias is:
aliasNAME
=DEFINITION
For example, the following line defines an alias lt
which outputs a long listing (option -l
), sorts it by
modification time (-t
) and prints it in reverse order
while sorting (-r
):
alias lt='ls -ltr'
To view all alias definitions, use alias. Remove your alias with unalias.
A shell variable can be global or local. Global variables, or environment variables, can be accessed in all shells. In contrast, local variables are visible in the current shell only.
To view all environment variables, use the printenv command. To see the value of a variable, insert the name of your variable as an argument:
printenv PATH
A variable, be it global or local, can also be viewed with echo:
echo $PATH
To set a local variable, use a variable name followed by the equal sign, followed by the value:
PROJECT="SLED"
Do not insert spaces around the equal sign, otherwise you get an error. To set an environment variable, use export:
export NAME="tux"
To remove a variable, use unset:
unset NAME
The following table contains some common environment variables which can be used in you shell scripts:
Table 22.5. Useful Environment Variables¶
|
the home directory of the current user |
|
the current hostname |
|
when a tool is localized, it uses the language from this environment
variable. English can also be set to |
|
the search path of the shell, a list of directories separated by colon |
|
specifies the normal prompt printed before each command |
|
specifies the secondary prompt printed when you execute a multi-line command |
|
current working directory |
|
the current user |
For example, if you have the script foo.sh you can execute it like this:
foo.sh "Tux Penguin" 2000
To access all the arguments which are passed to your script, you need
positional parameters. These is $1
for the first
argument, $2
for the second, and so on. You can have up
to nine parameters. To get the script name, use $0
.
The following script foo.sh prints all arguments from 1 to 4:
#!/bin/sh echo \"$1\" \"$2\" \"$3\" \"$4\"
If you execute this script with the above arguments, you get:
"Tux Penguin" "2000" "" ""
Variable substitutions apply a pattern to the content of a variable either from the left or right side. The following list contains the possible syntax forms:
${VAR#pattern}
removes the shortest possible match from the left:
file=/home/tux/book/book.tar.bz2 echo ${file#*/} home/tux/book/book.tar.bz2
${VAR##pattern}
removes the longest possible match from the left:
file=/home/tux/book/book.tar.bz2 echo ${file##*/} book.tar.bz2
${VAR%pattern}
removes the shortest possible match from the right:
file=/home/tux/book/book.tar.bz2 echo ${file%.*} /home/tux/book/book.tar
${VAR%%pattern}
removes the longest possible match from the right:
file=/home/tux/book/book.tar.bz2 echo ${file%%.*} /home/tux/book/book
${VAR/pattern_1/pattern_2}
substitutes the content of VAR
from the
pattern_1
with
pattern_2
:
file=/home/tux/book/book.tar.bz2 echo ${file/tux/wilber} /home/wilber/book/book.tar.bz2
Shells allow you to concatenate and group commands for conditional execution. Each command returns an exit code which determines the success or failure of its operation. If it is 0 (zero), the command was successful. Everything else marks an error which is specific to the command.
The following list shows, how commands can be grouped:
Command1 ; Command2
executes the commands in sequential order. The exit code is not checked. The following line displays the content of the file with cat and then prints its file properties with ls regardless of their exit codes:
cat filelist.txt ; ls -l filelist.txt
Command1 && Command2
runs the right command, if the left command was successful (logical AND). The following line displays the content of the file and prints its file properties only, when the previous command was successful (compare it with the previous entry in this list):
cat filelist.txt && ls -l filelist.txt
Command1 || Command2
runs the right command, when the left command has failed (logical OR).
The following line creates only a directory in
/home/wilber/bar
when the creation of the
directory in /home/tux/foo
has failed:
mkdir /home/tux/foo || mkdir /home/wilber/bar
funcname(){ ... }
creates a shell function. You can use the positional parameters to
access its arguments. The following line defines the function
hello
to print a short message:
hello() { echo "Hello $1"; }
Call this function like this:
hello Tux
which prints:
Hello Tux
To control the flow of your script, a shell has while, if, for and case constructs.
The if command is used to check expressions. For example, the following code tests whether the current user is Tux:
if test $USER = "tux" ; then echo "Hello Tux." else echo "You are not Tux." fi
The test expression can be as complex or simple as possible. The
following expression checks if the file foo.txt
exists:
if test -e /tmp/foo.txt ; then echo "Found foo.txt" fi
The test expression can also be abbreviated in angled brackets:
if [ -e /tmp/foo.txt ] ; then echo "Found foo.txt" fi
Find more useful expressions at http://bash.cyberciti.biz/guide/If..else..fi.
The for loop allows you to execute commands to a list of entries. For example, the following code prints some information about PNG files in the current directory:
for i in *.png; do ls -l $i done
Important information about Bash is provided in the man pages man bash. More about this topic can be found in the following list:
http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html—Bash Guide for Beginners
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html—BASH Programming - Introduction HOW-TO
http://tldp.org/LDP/abs/html/index.html—Advanced Bash-Scripting Guide
http://www.grymoire.com/Unix/Sh.html—Sh - the Bourne Shell