slackware-current/slackbook/html/shell-command-line.html
Patrick J Volkerding 75a4a592e5 Slackware 13.37
Mon Apr 25 13:37:00 UTC 2011
Slackware 13.37 x86_64 stable is released!

Thanks to everyone who pitched in on this release: the Slackware team,
the folks producing upstream code, and linuxquestions.org for providing
a great forum for collaboration and testing.

The ISOs are off to be replicated, a 6 CD-ROM 32-bit set and a
dual-sided
32-bit/64-bit x86/x86_64 DVD.  Please consider supporting the Slackware
project by picking up a copy from store.slackware.com.  We're taking
pre-orders now, and offer a discount if you sign up for a subscription.

As always, thanks to the Slackware community for testing, suggestions,
and feedback.  :-)

Have fun!
2018-05-31 22:45:18 +02:00

307 lines
12 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="HTML Tidy, see www.w3.org" />
<title>The Command Line</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.7" />
<link rel="HOME" title="Slackware Linux Essentials" href="index.html" />
<link rel="UP" title="The Shell" href="shell.html" />
<link rel="PREVIOUS" title="The Shell" href="shell.html" />
<link rel="NEXT" title="The Bourne Again Shell (bash)" href="shell-bash.html" />
<link rel="STYLESHEET" type="text/css" href="docbook.css" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body class="SECT1" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#840084"
alink="#0000FF">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0"
cellspacing="0">
<tr>
<th colspan="3" align="center">Slackware Linux Essentials</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="shell.html"
accesskey="P">Prev</a></td>
<td width="80%" align="center" valign="bottom">Chapter 8 The Shell</td>
<td width="10%" align="right" valign="bottom"><a href="shell-bash.html"
accesskey="N">Next</a></td>
</tr>
</table>
<hr align="LEFT" width="100%" />
</div>
<div class="SECT1">
<h1 class="SECT1"><a id="SHELL-COMMAND-LINE" name="SHELL-COMMAND-LINE">8.2 The Command
Line</a></h1>
<div class="SECT2">
<h2 class="SECT2"><a id="SHELL-COMMAND-LINE-RUNNING"
name="SHELL-COMMAND-LINE-RUNNING">8.2.1 Running Programs</a></h2>
<p>It's hard to get much accomplished without running a program; you might be able to
prop something up with your computer or hold a door open, and some will make the most
lovely humming noise when running, but that's really about it. And I think we can all
agree that its use as a humming doorstop isn't what brought the personal computer the
popularity it now enjoys.</p>
<p>So, remember how almost everything in Linux is a file? Well, that goes for programs,
too. Every command you run (that isn't built into the shell) resides as a file somewhere.
You run a program simply by specifying the full path to it.</p>
<p>For instance, remember that <tt class="COMMAND">su</tt> command from the last section?
Well, it's actually in the <tt class="FILENAME">/bin</tt> directory: <tt
class="COMMAND">/bin/su</tt> would run it nicely.</p>
<p>So why, then, does just typing <tt class="COMMAND">su</tt> work? After all, you didn't
say it was in <tt class="FILENAME">/bin</tt>. It could just as easily have been in <tt
class="FILENAME">/usr/local/share</tt>, right? How did it <span class="emphasis"><i
class="EMPHASIS">know</i></span>? The answer to that lies in the <tt
class="ENVAR">PATH</tt> environment variable; most shells have either <tt
class="ENVAR">PATH</tt> or something very much like <tt class="ENVAR">PATH</tt>. It
basically contains a list of directories to look in for programs you try to run. So when
you ran <tt class="COMMAND">su</tt>, your shell ran through its list of directories,
checking each one for an executable file called <tt class="COMMAND">su</tt> that it could
run; the first one it came to, it ran. This happens whenever you run a program without
specifying a full path to it; if you get a &#8220;&#8220;<tt class="ERRORNAME">Command
not found</tt>&#8221;&#8221; error, that only means that the program you tried to run
isn't in your <tt class="ENVAR">PATH</tt>. (Of course, this would be true if the program
doesn't exist at all...) We'll discuss environment variables in more depth in <a
href="shell-bash.html#SHELL-BASH-ENVIRONMENT">Section 8.3.1</a>.</p>
<p>Remember also that &#8220;<tt class="FILENAME">.</tt>&#8221; is shorthand for the
current directory, so if you happened to be in <tt class="FILENAME">/bin</tt>, <tt
class="FILENAME">./su</tt> would have worked as an explicit full path.</p>
</div>
<div class="SECT2">
<h2 class="SECT2"><a id="SHELL-COMMAND-LINE-WILDCARD"
name="SHELL-COMMAND-LINE-WILDCARD">8.2.2 Wildcard Matching</a></h2>
<p>Nearly every shell recognizes some characters as being substitutes or abbreviations
that mean anything goes here. Such characters are aptly named wildcards; the most common
are <var class="LITERAL">*</var> and <var class="LITERAL">?</var>. By convention, <var
class="LITERAL">?</var> usually matches any single character. For instance, suppose
you're in a directory with three files: <tt class="FILENAME">ex1.txt</tt>, <tt
class="FILENAME">ex2.txt</tt>, and <tt class="FILENAME">ex3.txt</tt>. You want to copy
all of those files (using the <tt class="COMMAND">cp</tt> command we cover in <a
href="file-commands-copymove.html#FILE-COMMANDS-COPYMOVE-CP">Section 10.5.1</a>) to
another directory, say <tt class="FILENAME">/tmp</tt>. Well, typing <tt
class="COMMAND">cp ex1.txt ex2.txt ex3.txt /tmp</tt> is entirely too much work. It's much
easier to type <tt class="COMMAND">cp ex?.txt /tmp</tt>; the <var class="LITERAL">?</var>
will match each of the characters &#8220;1&#8221;, &#8220;2&#8221;, and &#8220;3&#8221;,
and each in turn will be substituted in.</p>
<p>What's that you say? That's <span class="emphasis"><i
class="EMPHASIS">still</i></span> too much work? You're right. It's appalling; we have
labor laws to protect us from that sort of thing. Fortunately, we also have <var
class="LITERAL">*</var>. As was already mentioned, <var class="LITERAL">*</var> matches
&#8220;any number of characters&#8221;, including 0. So if those three files were the
only ones in the directory, we could have simply said <tt class="COMMAND">cp * /tmp</tt>
and gotten them all in one fell swoop. Suppose, though, that there is also a file called
<tt class="FILENAME">ex.txt</tt> and one called <tt class="FILENAME">hejaz.txt</tt>. We
want to copy <tt class="FILENAME">ex.txt</tt> but not <tt
class="FILENAME">hejaz.txt</tt>; <tt class="COMMAND">cp ex* /tmp</tt> will do that for
us.</p>
<p><tt class="COMMAND">cp ex?.txt /tmp</tt>, would, of course, only get our original
three files; there's no character in <tt class="FILENAME">ex.txt</tt> to match that <var
class="LITERAL">?</var>, so it would be left out.</p>
<p>Another common wildcard is the bracket pair <var class="LITERAL">[ ]</var>. Any
characters inside the brackets will be substituted in place of the <var class="LITERAL">[
]</var> to find matches. Sound confusing? It's not too bad. Suppose for instance, we have
a directory containing the following 8 files: <tt class="FILENAME">a1</tt>, <tt
class="FILENAME">a2</tt>, <tt class="FILENAME">a3</tt>, <tt class="FILENAME">a4</tt>, <tt
class="FILENAME">aA</tt>, <tt class="FILENAME">aB</tt>, <tt class="FILENAME">aC</tt>, and
<tt class="FILENAME">aD</tt> . We want to only find the files ending in numbers; <var
class="LITERAL">[ ]</var> will do this for us.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ls a[1-4]</kbd>
a1 a2 a3 a4
</pre>
</td>
</tr>
</table>
<p>But what we really want is just <tt class="FILENAME">a1</tt>, <tt
class="FILENAME">a2</tt>, and <tt class="FILENAME">a4</tt>? In the previous example we
used - to mean all values between 1 and 4. We can also separate individual entries with
commas.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ls a[1,2,4]</kbd>
a1 a2 a4
</pre>
</td>
</tr>
</table>
<p>I know what you're thinking now, &#8220;Well what about letters?&#8221; Linux is
case-sensitive, meaning that <var class="LITERAL">a</var> and <var
class="LITERAL">A</var> are different characters and are only related in your mind.
Capitals always come before lowercase letters, so <var class="LITERAL">A</var> and <var
class="LITERAL">B</var> come before <var class="LITERAL">a</var> and <var
class="LITERAL">b</var>. Continuing with our earlier example, if we wanted files <tt
class="FILENAME">a1</tt>, and <tt class="FILENAME">A1</tt>, we can find these quickly
with <var class="LITERAL">[ ]</var>.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ls [A,a]1</kbd>
A1 a1
</pre>
</td>
</tr>
</table>
<p>Note, that if we had included a hyphen instead of a comma, we would have gotten
incorrect results.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ls [A-a]1</kbd>
A1 B1 C1 D1 a1
</pre>
</td>
</tr>
</table>
<p>You can also combine hyphen and comma strings.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ls [A,a-d]</kbd>
A1 a1 b1 c1 d1
</pre>
</td>
</tr>
</table>
</div>
<div class="SECT2">
<h2 class="SECT2"><a id="SHELL-COMMAND-LINE-PIPING"
name="SHELL-COMMAND-LINE-PIPING">8.2.3 Input/Output Redirection and Piping</a></h2>
<p>(Here comes something cool.)</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ps &#62; blargh</kbd>
</pre>
</td>
</tr>
</table>
<p>Y'know what that is? That's me running <tt class="COMMAND">ps</tt> to see which
processes are running; <tt class="COMMAND">ps</tt> is covered in <a
href="process-control-ps.html">Section 11.3</a>. That's not the cool part. The cool part
is <var class="LITERAL">&gt; blargh</var>, which means, roughly, take the output from <tt
class="COMMAND">ps</tt> and write it to a file called <tt class="FILENAME">blargh</tt>.
But wait, it gets cooler.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ps | less</kbd>
</pre>
</td>
</tr>
</table>
<p>That one takes the output from <tt class="COMMAND">ps</tt> and pipes it through <tt
class="COMMAND">less</tt>, so I can scroll through it at my leisure.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ps &gt;&gt; blargh</kbd>
</pre>
</td>
</tr>
</table>
<p>This is the third most commonly used redirector; it does the same thing as
&#8220;&gt;&#8221;, except that &#8220;&gt;&gt;&#8221; will append output from <tt
class="COMMAND">ps</tt> to the file <tt class="FILENAME">blargh</tt>, if said file
exists. If not, just like &#8220;&gt;&#8221;, it will be created. (&#8220;&gt;&#8221;
will obliterate the current contents of <tt class="FILENAME">blargh</tt>.)</p>
<p>There is also a &#8220;&lt;&#8221; operator, which means take your input from the
following, but it's not used nearly so often.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd
class="USERINPUT">fromdos &lt; dosfile.txt &gt; unixfile.txt</kbd>
</pre>
</td>
</tr>
</table>
<p>Redirection gets really fun when you start piling it up:</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
<pre class="SCREEN">
<samp class="PROMPT">%</samp> <kbd class="USERINPUT">ps | tac &gt;&gt; blargh</kbd>
</pre>
</td>
</tr>
</table>
<p>That will run <tt class="COMMAND">ps</tt>, reverse the lines of its output, and append
those to the file <tt class="FILENAME">blargh</tt>. You can stack as many of these up as
you want; just be careful to remember that they get interpreted from left to right.</p>
<p>See the <tt class="COMMAND">bash</tt>(1) man page for more detailed information on
redirection.</p>
</div>
</div>
<div class="NAVFOOTER">
<hr align="LEFT" width="100%" />
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td width="33%" align="left" valign="top"><a href="shell.html"
accesskey="P">Prev</a></td>
<td width="34%" align="center" valign="top"><a href="index.html"
accesskey="H">Home</a></td>
<td width="33%" align="right" valign="top"><a href="shell-bash.html"
accesskey="N">Next</a></td>
</tr>
<tr>
<td width="33%" align="left" valign="top">The Shell</td>
<td width="34%" align="center" valign="top"><a href="shell.html"
accesskey="U">Up</a></td>
<td width="33%" align="right" valign="top">The Bourne Again Shell (bash)</td>
</tr>
</table>
</div>
</body>
</html>