Differences between revisions 4 and 5
Revision 4 as of 2007-09-19 01:03:42
Size: 4485
Editor: GreyCat
Comment: fill in some stuff
Revision 5 as of 2008-11-22 14:09:54
Size: 4486
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 5: Line 5:
This FAQ answers frequent questions related to the Unix operating system. If you have questions related to the ["BASH"] shell, the BashFaq is a better place to look. This FAQ answers frequent questions related to the Unix operating system. If you have questions related to the [[BASH]] shell, the BashFaq is a better place to look.
Line 7: Line 7:
[[TableOfContents]] <<TableOfContents>>
Line 9: Line 9:
[[Anchor(faq1)]] <<Anchor(faq1)>>
Line 75: Line 75:
[[Anchor(faq2)]] <<Anchor(faq2)>>
Line 100: Line 100:
[[Anchor(faq3)]] <<Anchor(faq3)>>
Line 116: Line 116:
[[Anchor(faq4)]] <<Anchor(faq4)>>
Line 136: Line 136:
This is also [:BashFAQ#faq32:Bash FAQ #32]. This is also [[BashFAQ#faq32|Bash FAQ #32]].

Unix Frequently Asked Questions

This FAQ answers frequent questions related to the Unix operating system. If you have questions related to the BASH shell, the BashFaq is a better place to look.

1. How can I get the IP address for a host name?

Depending on where the (host, ip_address) relationship is stored, different ways of resolving a host name to an ip address (or vice versa) exist. The most common ones are /etc/hosts, NIS, and DNS. As if that wasn't enough, many systems use more than one method, usually configured in the file /etc/nsswitch.conf.

In the easiest case the system has the getent command, which will use /etc/hosts, NIS, DNS, or whatever name resolution was configured in the right sequence:

    $ getent hosts www.shelldorado.com
    127.0.0.1   www.shelldorado.com

If we don't have this very useful command (_XXX is there an OpenSource version available?_), we are on our own and have to access the respective database ourselves. Note that we don't show here how to find out which name resolutions are configured, or in which sequence they are used.

1.1. /etc/hosts

  •     # lookup hostname using /etc/hosts
        lookup_files () { # usage: lookup_files hostname
            awk '{ for ( i=2; i<=NF; ++i ) if ( $i == "'"$1"'" ) print $1 }' /etc/hosts
        }

1.2. NIS - Network Information System, also known as Yellow Pages

  •     # lookup hostname using NIS
        lookup_nis () {
            ypcat hosts |
                awk '{ for ( i=2; i<=NF; ++i ) if ( $i == "'"$1"'" ) print $1 }'
        }
    Note: the use of NIS to store hostname-to-IP mappings is deprecated.
    • This should probably be using ypmatch instead of scanning the entire output of ypcat, but since I don't have any NIS systems configured to do this, I can't test it myself.

1.3. DNS - Domain Name Service

  •     # lookup hostname using DNS
        lookup_dns () {
            nslookup "$1" 2>/dev/null |
                awk '{ cnt [$1]++; val [cnt [$1] $1] = $2 }
                        END { print val ["2Address:"] }'
        }

    TODO: how to use host or dig

    • Suggestions by Tarax: with bind9-host and dig, following pipelines seem to work quite well. Just replace the nslookup/awk instructions above with one of them... and thank you for this page :-)

      •       host "$1" | cut -d" " -f4 | sort | uniq
              dig a +noall $1 +answer | cut -f6 | sort | uniq

1.4. LDAP - Lightweight Directory Access Protocol

  •     # lookup hostname using LDAP
        lookup_ldap () {
           # TODO: add query
        }

2. How can I copy a directory with all files and subdirectories?

    src=/home/$USER         # source
    dst=/tmp/backup         # destination

    cd "$src"
    find . -print | cpio -pdmv "$dst"

This method can be used to receate a directory hierarchy, without files, too:

    find . -type d -print | cpio -pdmv "$dst"

If you're copying across a network, this is an indispensable technique:

    cd /the/source
    tar cf - dir1 dir2 ... | ssh user@host "cd /the/dest && tar xvf -"

Antique Unix systems could achieve a similar effect using rsh (or remsh on some platforms) instead of ssh. rsh is extremely deprecated, but if you're stuck on such an old platform, you can use it in an emergency. Just be sure to undo your rhosts stuff after you're done.

3. How can I remove a file with a name starting with '-'?

Either

    rm ./-filename

(./ is the name of the current directory). Another way (for newer Unix systems):

    rm -- -filename

The "--" argument is a standard way to denote the end of the command line options.

4. How can I redirect the output of the time(1) command?

time is a special command that writes to standard error (file descriptor 2). It's not possible to directly redirect its output to a file, e.g.

    time ls 2>time.out

would only redirect the ls standard error output, not the time output. A solution is to either call time in a subshell with redirected output, e.g.

    sh -c "time ls" 2>time.out

or use braces:

    { time ls; } 2>time.out

This is also Bash FAQ #32.

UnixFaq (last edited 2014-10-06 11:25:54 by 46)