editor, include its -w
flag to disable line wrap.
In this section, you learn how to write a simple shell script to set up a number of aliases (command synonyms) whenever you log on. Instead of typing all the aliases every time you log on, you can put them in a file by using a text editor, such as vi
, and then execute the file. Normally these changes are saved in systemwide shell configuration files under the /etc
directory to make the changes active for all users or in your .bashrc
, .cshrc
(if you use tcsh
), or .bash_profile
files in your home directory.
Here is what is contained in myenv
, a sample shell script created for this purpose (for bash
):
#!/bin/sh
alias ll='ls -l'
alias ldir='ls -aF'
alias copy='cp'
This simple script creates command aliases, or convenient shorthand forms of commands, for the ls
and cp
commands. The ll
alias provides a long directory listing: The ldir
alias is the ls
command, but prints indicators (for directories or executable files) in listings. The copy
alias is the same as the cp
command. You can experiment and add your own options or create aliases of other commands with options you frequently use.
You can execute myenv
in a variety of ways under Linux. As shown in this example, you can make myenv
executable by using the chmod
command and then execute it as you would any other native Linux command:
$ chmod +x myenv
This line turns on the executable permission of myenv
, which can be checked with the ls
command and its -l
option like this:
$ ls -l myenv
-rwxrwxr-x 1 andrew andrew 65 2007-11-12 17:38 myenv
Running a Shell Program
You can run your new shell program in several ways. Each method produces the same results, which is a testament to the flexibility of using the shell with Linux. One way to run your shell program is to execute the file myenv
from the command line as if it were a Linux command:
$ ./myenv
A second way to execute myenv
under a particular shell, such as zsh, is as follows:
$ zsh myenv
This invokes a new zsh
shell and passes the filename myenv
as a parameter to execute the file. A third way requires you to create a directory named bin
in your home directory, and to then copy the new shell program into this directory. You can then run the program without specifying a specific location or using a shell. You do this like so:
$ mkdir bin
$ mv myenv bin
$ myenv
This works because Fedora is set up by default to include the executable path $HOME/bin
in your shell's environment. You can view this environment variable, named PATH
, by piping the output of the env
command through fgrep,
like so:
$ env | fgrep PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:
/usr/X11R6/bin:/sbin:/home/andrew/bin
As you can see, the user (andrew in this example) can use the new bin
directory to hold executable files. Another way to bring up an environment variable is to use the echo
command along with the variable name (in this case, $PATH
):
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/andrew/bin
Never put .
in your $PATH
to execute files or a command in the current directory — this presents a serious security risk, especially for the root operator, and even more so if . is first in your $PATH search order. Trojan scripts placed by crackers in directories such as /tmp
can be used for malicious purposes, and are executed immediately if the current working directory is part of your $PATH
.
After you execute the command myenv
, you should be able to use ldir
from the command line to get a list of files under the current directory and ll
to get a list of files with attributes displayed. However, the best way to use the new commands in myenv
is to put them into your shell's login or profile file. For Fedora, and nearly all Linux users, the default shell is bash
, so you can make these commands available for everyone on your system by putting them in the /etc/bashrc
file. Systemwide aliases for tcsh
are contained in files with the extension .csh
under the /etc/profile.d
directory. The shell can use these command aliases, too.
Interpreting Shell Scripts Through Specific Shells
The majority of shell scripts use a #!
) at the beginning to control the type of shell used to run the script; this bang line calls for an sh-incantation of bash
:
#!/bin/sh
A shebang line (short for #
and !
) tells the Linux kernel that a specific command (a shell, or in the case of other scripts, perhaps awk
or Perl) is to be used to interpret the contents of the file. Using a shebang line is common practice for all shell scripting. For example, if you write a shell script using bash
, but want the script to execute as if run by the Bourne shell, sh
, the first line of your script will contain #!/bin/sh
, which is a link to the bash
shell. Running bash
as sh
causes bash
to act as a Bourne shell. This is the reason for the symbolic link sh,
which points to bash
.
The shebang line is a magic number, as defined in /usr/share/magic
— a text database of magic numbers for the Linux file
command. Magic numbers are used by many different Linux commands to quickly identify a type of file, and the database format is documented in the section five man page named magic
(read by using man 5 magic
). For example, magic numbers can be used by the Linux file
command to display the identity of a script (no matter what filename is used) as a shell script if a specific shell or other interpreter is used, such as awk
or Perl.
You might also find different or new environment variables available to your scripts by using different shells.