Shell Odds and Ends

Odds and Ends

This section includes a few tidbits that I wasn’t sure where to put.

Unlike DOS Batch-Scripts, Linux Shell-Scripts do not diplay each line as it is executed. Instead, the default is not to display anything unless you explicitely output it. However, if you place set -x in your script, each command with its corresponding arguments is printed as it is executed. If you want to just show a section of your script, include the set -x before that section, then another set +x at the end. The set +x turns off the output.

If you want, you can capture output into another file, without having it go to the screen. This is done using the fact that output generated as a result of the set -x is going to stderr and not stdout. If you redirect stdout somewhere, the output from set -x still goes to the screen. On the other hand, if you redirect stderr, stdout still goes to your screen. To redirect sterr to a file start, the script like this:

myscript 2>/tmp/output

This says to send file descriptor 2 (stderr) to the file /tmp/output.

To create a directory that is several levels deep, you do not have to change directories to the parent and then run mkdir from there. The mkdir command takes as an argument the path name of the directory you want to create. It doesn’t matter if it is a subdirectory, relative path, or absolute path. The system will do that for you. Also, if you want to create several levels of directories, you don’t have to make each parent directory before you make the subdirectories. Instead, you can use the -p option to mkdir, which will automatically create all the necessary directories.

For example, imagine that we want to create the subdirectory ./letters/personal/john, but the subdirectory letters does not exist yet. This also means that the subdirectory personal doesn’t exist, either. If we run mkdir like this:

mkdir -p ./letters/personal/john

then the system will create ./letters, then ./letters/personal, and then ./letters/personal/john.

Assume that you want to remove a file that has multiple links; for example, assume that ls, lc, lx, lf, etc., are links to the same file. The system keeps track of how many names reference the file through the link count (more on this concept later). Such links are called hard links. If you remove one of them, the file still exists as there are other names that reference it. Only when we remove the last link (and with that, the link count goes to zero) will the file be removed.

There is also the issue of symbolic links. A symbolic link (also called a soft link) is nothing more than a path name that points to some other file, or even to some directory. It is not until the link is accessed that the path is translated into the “real” file. This has some interesting effects. For example, if we create a link like this:

ln -s /home/jimmo/letter.john /home/jimmo/text/letter.john

you would see the symbolic link as something like this:

drw-r–r– 1 jimmo support 29 Sep 15 10:06 letter.john-> /home/jimmo/letter.john

Then,the file /home/jimmo/text/letter.john is a symbolic link to /home/jimmo/letter.john. Note that the link count on /home/jimmo/letter.john doesn’t change, because the system sees these as two separate files. It is easier to think of the file /home/jimmo/text/letter.john as a text file that contains the path to /home/jimmo/letter.john. If we remove /home/jimmo/letter.john, /home/jimmo/text/letter.john will still exist. However, it will point to something that doesn’t exist. Even if there are other hard links that point to the same file like /home/jimmo/letter.john, that doesn’t matter. The symbolic link, /home/jimmo/text/letter.john, points to the path /home/jimmo/letter.john. Because the path no longer exists, the file can no longer be accessed via the symbolic link. It is also possible for you to create a symbolic link to a file that does not exist, as the system does not check until you access the file.

Another important aspect is that symbolic links can extend across file systems. A regular or hard link is nothing more than a different name for the same physical file and used the same inode number. Therefore it must be on the same filesystem. Symbolic links contain a path, so the destination can be on another filesystem (and in some cases on another machine). For more on inodes, see the section on filesystems.

The file command can be used to tell you the type of file. With DOS and Windows, it’s fairly obvious by looking at the file’s extension to determine the files type. For example, files ending in .exe are executables (programs), files ending in .txt are text files, and files ending in .doc are documents (usually from some word processor). However, a program in UNIX can just as easily have the ending .doc or .exe, or no ending at all.

The file command uses the file /etc/magic to make an assumption about the contents of a file. The file command reads the header (first part of the file) and uses the information in /etc/magic to make its guess. Executables of a specific type (a.out, ELF) all have the same basic format, so file can easily recognize them. However, there are certain similarities between C source code, shell scripts, and even text files that could confuse file.

For a list of some of the more commonly used commands, take a look here.