old-www/LDP/www.debian.org/doc/manuals/debian-reference/ch12.en.html

2195 lines
108 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 12. Programming</title>
<link rel="stylesheet" href="debian-reference.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="index.en.html" title="Debian Reference">
<link rel="up" href="index.en.html" title="Debian Reference">
<link rel="prev" href="ch11.en.html" title="Chapter 11. Data conversion">
<link rel="next" href="apa.en.html" title="Appendix A. Appendix">
<link rel="preface" href="pr01.en.html" title="Preface">
<link rel="chapter" href="ch01.en.html" title="Chapter 1. GNU/Linux tutorials">
<link rel="chapter" href="ch02.en.html" title="Chapter 2. Debian package management">
<link rel="chapter" href="ch03.en.html" title="Chapter 3. The system initialization">
<link rel="chapter" href="ch04.en.html" title="Chapter 4. Authentication">
<link rel="chapter" href="ch05.en.html" title="Chapter 5. Network setup">
<link rel="chapter" href="ch06.en.html" title="Chapter 6. Network applications">
<link rel="chapter" href="ch07.en.html" title="Chapter 7. The X Window System">
<link rel="chapter" href="ch08.en.html" title="Chapter 8. I18N and L10N">
<link rel="chapter" href="ch09.en.html" title="Chapter 9. System tips">
<link rel="chapter" href="ch10.en.html" title="Chapter 10. Data management">
<link rel="chapter" href="ch11.en.html" title="Chapter 11. Data conversion">
<link rel="chapter" href="ch12.en.html" title="Chapter 12. Programming">
<link rel="appendix" href="apa.en.html" title="Appendix A. Appendix">
<link rel="section" href="ch12.en.html#_the_shell_script" title="12.1. The shell script">
<link rel="section" href="ch12.en.html#_make" title="12.2. Make">
<link rel="section" href="ch12.en.html#_c" title="12.3. C">
<link rel="section" href="ch12.en.html#_debug" title="12.4. Debug">
<link rel="section" href="ch12.en.html#_flex_8212_a_better_lex" title="12.5. Flex — a better Lex">
<link rel="section" href="ch12.en.html#_bison_8212_a_better_yacc" title="12.6. Bison — a better Yacc">
<link rel="section" href="ch12.en.html#_autoconf" title="12.7. Autoconf">
<link rel="section" href="ch12.en.html#_perl_short_script_madness" title="12.8. Perl short script madness">
<link rel="section" href="ch12.en.html#_web" title="12.9. Web">
<link rel="section" href="ch12.en.html#_the_source_code_translation" title="12.10. The source code translation">
<link rel="section" href="ch12.en.html#_making_debian_package" title="12.11. Making Debian package">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">Chapter 12. Programming</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="ch11.en.html"><img src="images/prev.gif" alt="Prev"></a> </td>
<th width="60%" align="center"> </th>
<td width="20%" align="right"> <a accesskey="n" href="apa.en.html"><img src="images/next.gif" alt="Next"></a>
</td>
</tr>
</table>
<hr>
</div>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
<a name="_programming"></a>Chapter 12. Programming</h2></div></div></div>
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="section"><a href="ch12.en.html#_the_shell_script">12.1. The shell script</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="ch12.en.html#_posix_shell_compatibility">12.1.1. POSIX shell compatibility</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_shell_parameters">12.1.2. Shell parameters</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_shell_conditionals">12.1.3. Shell conditionals</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_shell_loops">12.1.4. Shell loops</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_the_shell_command_line_processing_sequence">12.1.5. The shell command-line processing sequence</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_utility_programs_for_shell_script">12.1.6. Utility programs for shell script</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_shell_script_dialog">12.1.7. Shell script dialog</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_shell_script_example_with_zenity">12.1.8. Shell script example with zenity</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="ch12.en.html#_make">12.2. Make</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_c">12.3. C</a></span></dt>
<dd><dl><dt><span class="section"><a href="ch12.en.html#_simple_c_program_gcc">12.3.1. Simple C program (gcc)</a></span></dt></dl></dd>
<dt><span class="section"><a href="ch12.en.html#_debug">12.4. Debug</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="ch12.en.html#_basic_gdb_execution">12.4.1. Basic gdb execution</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_debugging_the_debian_package">12.4.2. Debugging the Debian package</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_obtaining_backtrace">12.4.3. Obtaining backtrace</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_advanced_gdb_commands">12.4.4. Advanced gdb commands</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_debugging_x_errors">12.4.5. Debugging X Errors</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_check_dependency_on_libraries">12.4.6. Check dependency on libraries</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_memory_leak_detection_tools">12.4.7. Memory leak detection tools</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_static_code_analysis_tools">12.4.8. Static code analysis tools</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_disassemble_binary">12.4.9. Disassemble binary</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="ch12.en.html#_flex_8212_a_better_lex">12.5. Flex — a better Lex</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_bison_8212_a_better_yacc">12.6. Bison — a better Yacc</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_autoconf">12.7. Autoconf</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="ch12.en.html#_compile_and_install_a_program">12.7.1. Compile and install a program</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_uninstall_program">12.7.2. Uninstall program</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="ch12.en.html#_perl_short_script_madness">12.8. Perl short script madness</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_web">12.9. Web</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_the_source_code_translation">12.10. The source code translation</a></span></dt>
<dt><span class="section"><a href="ch12.en.html#_making_debian_package">12.11. Making Debian package</a></span></dt>
</dl>
</div>
<p>I provide some pointers for people to learn programming on the Debian system enough to trace the packaged source code. Here are notable packages and corresponding documentation packages for programing.</p>
<div class="table">
<a name="listofpackagestohelpprograming"></a><p class="title"><b>Table 12.1. List of packages to help programing</b></p>
<div class="table-contents"><table summary="List of packages to help programing" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
documentation
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/autoconf" target="_top">
<code class="literal">autoconf</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=autoconf" target="_top">http://qa.debian.org/popcon.php?package=autoconf</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/a/autoconf.html" target="_top">1896</a></td>
<td align="left">
"<code class="literal">info autoconf</code>" provided by <code class="literal">autoconf-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/automake" target="_top">
<code class="literal">automake</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=automake" target="_top">http://qa.debian.org/popcon.php?package=automake</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/a/automake.html" target="_top">1530</a></td>
<td align="left">
"<code class="literal">info automake</code>" provided by <code class="literal">automake1.10-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/bash" target="_top">
<code class="literal">bash</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=bash" target="_top">http://qa.debian.org/popcon.php?package=bash</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/bash.html" target="_top">3935</a></td>
<td align="left">
"<code class="literal">info bash</code>" provided by <code class="literal">bash-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/bison" target="_top">
<code class="literal">bison</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=bison" target="_top">http://qa.debian.org/popcon.php?package=bison</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/bison.html" target="_top">1518</a></td>
<td align="left">
"<code class="literal">info bison</code>" provided by <code class="literal">bison-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/cpp" target="_top">
<code class="literal">cpp</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=cpp" target="_top">http://qa.debian.org/popcon.php?package=cpp</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/c/cpp.html" target="_top">63</a></td>
<td align="left">
"<code class="literal">info cpp</code>" provided by <code class="literal">cpp-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/ddd" target="_top">
<code class="literal">ddd</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=ddd" target="_top">http://qa.debian.org/popcon.php?package=ddd</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/d/ddd.html" target="_top">3636</a></td>
<td align="left">
"<code class="literal">info ddd</code>" provided by <code class="literal">ddd-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/exuberant-ctags" target="_top">
<code class="literal">exuberant-ctags</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=exuberant-ctags" target="_top">http://qa.debian.org/popcon.php?package=exuberant-ctags</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/e/exuberant-ctags.html" target="_top">323</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">exuberant-ctags</span>(1)</span>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/flex" target="_top">
<code class="literal">flex</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=flex" target="_top">http://qa.debian.org/popcon.php?package=flex</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/f/flex.html" target="_top">1352</a></td>
<td align="left">
"<code class="literal">info flex</code>" provided by <code class="literal">flex-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/gawk" target="_top">
<code class="literal">gawk</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=gawk" target="_top">http://qa.debian.org/popcon.php?package=gawk</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/gawk.html" target="_top">2061</a></td>
<td align="left">
"<code class="literal">info gawk</code>" provided by <code class="literal">gawk-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/gcc" target="_top">
<code class="literal">gcc</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=gcc" target="_top">http://qa.debian.org/popcon.php?package=gcc</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/gcc.html" target="_top">41</a></td>
<td align="left">
"<code class="literal">info gcc</code>" provided by <code class="literal">gcc-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/gdb" target="_top">
<code class="literal">gdb</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=gdb" target="_top">http://qa.debian.org/popcon.php?package=gdb</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/gdb.html" target="_top">6447</a></td>
<td align="left">
"<code class="literal">info gdb</code>" provided by <code class="literal">gdb-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/gettext" target="_top">
<code class="literal">gettext</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=gettext" target="_top">http://qa.debian.org/popcon.php?package=gettext</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/gettext.html" target="_top">6355</a></td>
<td align="left">
"<code class="literal">info gettext</code>" provided by <code class="literal">gettext-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/gfortran" target="_top">
<code class="literal">gfortran</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=gfortran" target="_top">http://qa.debian.org/popcon.php?package=gfortran</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/gfortran.html" target="_top">33</a></td>
<td align="left">
"<code class="literal">info gfortran</code>" provided by <code class="literal">gfortran-doc</code> (Fortran 95)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/fpc" target="_top">
<code class="literal">fpc</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=fpc" target="_top">http://qa.debian.org/popcon.php?package=fpc</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/f/fpc.html" target="_top">37</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">fpc</span>(1)</span> and html by <code class="literal">fp-docs</code> (Pascal)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/glade" target="_top">
<code class="literal">glade</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=glade" target="_top">http://qa.debian.org/popcon.php?package=glade</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/glade.html" target="_top">1752</a></td>
<td align="left">
help provided via menu (UI Builder)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/libc6" target="_top">
<code class="literal">libc6</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=libc6" target="_top">http://qa.debian.org/popcon.php?package=libc6</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/libc/libc6.html" target="_top">9500</a></td>
<td align="left">
"<code class="literal">info libc</code>" provided by <code class="literal">glibc-doc</code> and <code class="literal">glibc-doc-reference</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/make" target="_top">
<code class="literal">make</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=make" target="_top">http://qa.debian.org/popcon.php?package=make</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/m/make.html" target="_top">1145</a></td>
<td align="left">
"<code class="literal">info make</code>" provided by <code class="literal">make-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/xutils-dev" target="_top">
<code class="literal">xutils-dev</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=xutils-dev" target="_top">http://qa.debian.org/popcon.php?package=xutils-dev</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/x/xutils-dev.html" target="_top">1421</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">imake</span>(1)</span>, <span class="citerefentry"><span class="refentrytitle">xmkmf</span>(1)</span>, etc.
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/mawk" target="_top">
<code class="literal">mawk</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=mawk" target="_top">http://qa.debian.org/popcon.php?package=mawk</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/m/mawk.html" target="_top">198</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">mawk</span>(1)</span>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/perl" target="_top">
<code class="literal">perl</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=perl" target="_top">http://qa.debian.org/popcon.php?package=perl</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/p/perl.html" target="_top">17077</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">perl</span>(1)</span> and html pages provided by <code class="literal">perl-doc</code> and <code class="literal">perl-doc-html</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/python" target="_top">
<code class="literal">python</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=python" target="_top">http://qa.debian.org/popcon.php?package=python</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/p/python.html" target="_top">655</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">python</span>(1)</span> and html pages provided by <code class="literal">python-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/tcl8.4" target="_top">
<code class="literal">tcl8.4</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=tcl8.4" target="_top">http://qa.debian.org/popcon.php?package=tcl8.4</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/t/tcl8.4.html" target="_top">3332</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">tcl</span>(3)</span> and detail manual pages provided by <code class="literal">tcl8.4-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/tk8.4" target="_top">
<code class="literal">tk8.4</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=tk8.4" target="_top">http://qa.debian.org/popcon.php?package=tk8.4</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/t/tk8.4.html" target="_top">2712</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">tk</span>(3)</span> and detail manual pages provided by <code class="literal">tk8.4-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/ruby" target="_top">
<code class="literal">ruby</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=ruby" target="_top">http://qa.debian.org/popcon.php?package=ruby</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/r/ruby.html" target="_top">36</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">ruby</span>(1)</span> and interactive reference provided by <code class="literal">ri</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/vim" target="_top">
<code class="literal">vim</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=vim" target="_top">http://qa.debian.org/popcon.php?package=vim</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/v/vim.html" target="_top">1873</a></td>
<td align="left">
help(F1) menu provided by <code class="literal">vim-doc</code>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/susv2" target="_top">
<code class="literal">susv2</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=susv2" target="_top">http://qa.debian.org/popcon.php?package=susv2</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/s/susv2.html" target="_top">48</a></td>
<td align="left">
fetch "<a class="ulink" href="http://www.unix.org/version2/" target="_top">The Single Unix Specifications v2</a>"
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/susv3" target="_top">
<code class="literal">susv3</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=susv3" target="_top">http://qa.debian.org/popcon.php?package=susv3</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/s/susv3.html" target="_top">48</a></td>
<td align="left">
fetch "<a class="ulink" href="http://www.unix.org/version3/" target="_top">The Single Unix Specifications v3</a>"
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>Online references are available by typing "<code class="literal">man name</code>" after installing <code class="literal">manpages</code> and <code class="literal">manpages-dev</code> packages. Online references for the GNU tools are available by typing "<code class="literal">info program_name</code>" after installing the pertinent documentation packages. You may need to include the <code class="literal">contrib</code> and <code class="literal">non-free</code> archives in addition to the <code class="literal">main</code> archive since some GFDL documentations are not considered to be DFSG compliant.</p>
<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>Do not use "<code class="literal">test</code>" as the name of an executable test file. "<code class="literal">test</code>" is a shell builtin.</p></td></tr>
</table></div>
<div class="caution" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Caution">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="images/caution.png"></td>
<th align="left">Caution</th>
</tr>
<tr><td align="left" valign="top"><p>You should install software programs directly compiled from source into "<code class="literal">/usr/local</code>" or "<code class="literal">/opt</code>" to avoid collision with system programs.</p></td></tr>
</table></div>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p><a class="ulink" href="http://www.99-bottles-of-beer.net/" target="_top">Code examples of creating "Song 99 Bottles of Beer"</a> should give you good idea of practically all the programming languages.</p></td></tr>
</table></div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_the_shell_script"></a>12.1. The shell script</h2></div></div></div>
<p>The <a class="ulink" href="http://en.wikipedia.org/wiki/Shell_script" target="_top">shell script</a> is a text file with the execution bit set and contains the commands in the following format.</p>
<pre class="screen">#!/bin/sh
... command lines</pre>
<p>The first line specifies the shell interpreter which read and execute this file contents.</p>
<p>Reading shell scripts is the <span class="strong"><strong>best</strong></span> way to understand how a Unix-like system works. Here, I give some pointers and reminders for shell programming. See "Shell Mistakes" (<a class="ulink" href="http://www.greenend.org.uk/rjk/2001/04/shell.html" target="_top">http://www.greenend.org.uk/rjk/2001/04/shell.html</a>) to learn from mistakes.</p>
<p>Unlike shell interactive mode (see <a class="xref" href="ch01.en.html#_the_simple_shell_command" title="1.5. The simple shell command">Section 1.5, “The simple shell command”</a> and <a class="xref" href="ch01.en.html#_unix_like_text_processing" title="1.6. Unix-like text processing">Section 1.6, “Unix-like text processing”</a>), shell scripts frequently use parameters, conditionals, and loops.</p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_posix_shell_compatibility"></a>12.1.1. POSIX shell compatibility</h3></div></div></div>
<p>Many system scripts may be interpreted by any one of <a class="ulink" href="http://en.wikipedia.org/wiki/POSIX" target="_top">POSIX</a> shells (see <a class="xref" href="ch01.en.html#list-of-shell-programs" title="Table 1.13. List of shell programs">Table 1.13, “List of shell programs”</a>). The default shell for the system is "<code class="literal">/bin/sh</code>" which is a symlink pointing to the actual program.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">bash</span>(1)</span> for <code class="literal">lenny</code> or older
</p></li>
<li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">dash</span>(1)</span> for <code class="literal">squeeze</code> or newer
</p></li>
</ul></div>
<p>Avoid writing a shell script with <span class="strong"><strong>bashisms</strong></span> or <span class="strong"><strong>zshisms</strong></span> to make it portable among all POSIX shells. You can check it using <span class="citerefentry"><span class="refentrytitle">checkbashisms</span>(1)</span>.</p>
<div class="table">
<a name="listoftypicalbashisms"></a><p class="title"><b>Table 12.2. List of typical bashisms</b></p>
<div class="table-contents"><table summary="List of typical bashisms" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
Good: POSIX
</th>
<th align="left">
Avoid: bashism
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">if [ "$foo" = "$bar" ] ; then …</code>
</td>
<td align="left">
<code class="literal">if [ "$foo" == "$bar" ] ; then …</code>
</td>
</tr>
<tr>
<td align="left">
<code class="literal">diff -u file.c.orig file.c</code>
</td>
<td align="left">
<code class="literal">diff -u file.c{.orig,}</code>
</td>
</tr>
<tr>
<td align="left">
<code class="literal">mkdir /foobar /foobaz</code>
</td>
<td align="left">
<code class="literal">mkdir /foo{bar,baz}</code>
</td>
</tr>
<tr>
<td align="left">
<code class="literal">funcname() { … }</code>
</td>
<td align="left">
<code class="literal">function funcname() { … }</code>
</td>
</tr>
<tr>
<td align="left">
octal format: "<code class="literal">\377</code>"
</td>
<td align="left">
hexadecimal format: "<code class="literal">\xff</code>"
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>The "<code class="literal">echo</code>" command must be used with following cares since its implementation differs among shell builtin and external commands.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
Avoid using command option "<code class="literal">-e</code>" and "<code class="literal">-E</code>".
</p></li>
<li class="listitem"><p>
Avoid using any command options except "<code class="literal">-n</code>".
</p></li>
<li class="listitem"><p>
Avoid using escape sequences in the string since their handling varies.
</p></li>
</ul></div>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>Although "<code class="literal">-n</code>" option is <span class="strong"><strong>not</strong></span> really POSIX syntax, it is generally accepted.</p></td></tr>
</table></div>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p>Use the "<code class="literal">printf</code>" command instead of the "<code class="literal">echo</code>" command if you need to embed escape sequences in the output string.</p></td></tr>
</table></div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_shell_parameters"></a>12.1.2. Shell parameters</h3></div></div></div>
<p>Special shell parameters are frequently used in the shell script.</p>
<div class="table">
<a name="listofshellparameters"></a><p class="title"><b>Table 12.3. List of shell parameters</b></p>
<div class="table-contents"><table summary="List of shell parameters" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
shell parameter
</th>
<th align="left">
value
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">$0</code>
</td>
<td align="left">
name of the shell or shell script
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$1</code>
</td>
<td align="left">
first(1) shell argument
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$9</code>
</td>
<td align="left">
ninth(9) shell argument
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$#</code>
</td>
<td align="left">
number of positional parameters
</td>
</tr>
<tr>
<td align="left">
<code class="literal">"$*"</code>
</td>
<td align="left">
<code class="literal">"$1 $2 $3 $4 … "</code>
</td>
</tr>
<tr>
<td align="left">
<code class="literal">"$@"</code>
</td>
<td align="left">
<code class="literal">"$1" "$2" "$3" "$4" …</code>
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$?</code>
</td>
<td align="left">
exit status of the most recent command
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$$</code>
</td>
<td align="left">
PID of this shell script
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$!</code>
</td>
<td align="left">
PID of most recently started background job
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>Basic <span class="strong"><strong>parameter expansions</strong></span> to remember are followings.</p>
<div class="table">
<a name="listofshellparameterexpansions"></a><p class="title"><b>Table 12.4. List of shell parameter expansions</b></p>
<div class="table-contents"><table summary="List of shell parameter expansions" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
parameter expression form
</th>
<th align="left">
value if <code class="literal">var</code> is set
</th>
<th align="left">
value if <code class="literal">var</code> is not set
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">${var:-string}</code>
</td>
<td align="left">
"<code class="literal">$var</code>"
</td>
<td align="left">
"<code class="literal">string</code>"
</td>
</tr>
<tr>
<td align="left">
<code class="literal">${var:+string}</code>
</td>
<td align="left">
"<code class="literal">string</code>"
</td>
<td align="left">
"<code class="literal">null</code>"
</td>
</tr>
<tr>
<td align="left">
<code class="literal">${var:=string}</code>
</td>
<td align="left">
"<code class="literal">$var</code>"
</td>
<td align="left">
"<code class="literal">string</code>" (and run "<code class="literal">var=string</code>")
</td>
</tr>
<tr>
<td align="left">
<code class="literal">${var:?string}</code>
</td>
<td align="left">
"<code class="literal">$var</code>"
</td>
<td align="left">
echo "<code class="literal">string</code>" to <span class="strong"><strong>stderr</strong></span> (and exit with error)
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>Here, the colon "<code class="literal">:</code>" in all of these operators is actually optional.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p><span class="strong"><strong>with</strong></span> "<code class="literal">:</code>" = operator test for <span class="strong"><strong>exist</strong></span> and <span class="strong"><strong>not null</strong></span>
</p></li>
<li class="listitem"><p><span class="strong"><strong>without</strong></span> "<code class="literal">:</code>" = operator test for <span class="strong"><strong>exist</strong></span> only
</p></li>
</ul></div>
<div class="table">
<a name="listofkeyshellpatersubstitutions"></a><p class="title"><b>Table 12.5. List of key shell parameter substitutions</b></p>
<div class="table-contents"><table summary="List of key shell parameter substitutions" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
parameter substitution form
</th>
<th align="left">
result
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">${var%suffix}</code>
</td>
<td align="left">
remove smallest suffix pattern
</td>
</tr>
<tr>
<td align="left">
<code class="literal">${var%%suffix}</code>
</td>
<td align="left">
remove largest suffix pattern
</td>
</tr>
<tr>
<td align="left">
<code class="literal">${var#prefix}</code>
</td>
<td align="left">
remove smallest prefix pattern
</td>
</tr>
<tr>
<td align="left">
<code class="literal">${var##prefix}</code>
</td>
<td align="left">
remove largest prefix pattern
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_shell_conditionals"></a>12.1.3. Shell conditionals</h3></div></div></div>
<p>Each command returns an <span class="strong"><strong>exit status</strong></span> which can be used for conditional expressions.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
Success: 0 ("True")
</p></li>
<li class="listitem"><p>
Error: non 0 ("False")
</p></li>
</ul></div>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>"0" in the shell conditional context means "True", while "0" in the C conditional context means "False".</p></td></tr>
</table></div>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>"<code class="literal">[</code>" is the equivalent of the <code class="literal">test</code> command, which evaluates its arguments up to "<code class="literal">]</code>" as a conditional expression.</p></td></tr>
</table></div>
<p>Basic <span class="strong"><strong>conditional idioms</strong></span> to remember are followings.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
"<code class="literal">&lt;command&gt; &amp;&amp; &lt;if_success_run_this_command_too&gt; || true</code>"
</p></li>
<li class="listitem"><p>
"<code class="literal">&lt;command&gt; || &lt;if_not_success_run_this_command_too&gt; || true</code>"
</p></li>
<li class="listitem"><p>
A multi-line script snippet as the following
</p></li>
</ul></div>
<pre class="screen">if [ &lt;conditional_expression&gt; ]; then
&lt;if_success_run_this_command&gt;
else
&lt;if_not_success_run_this_command&gt;
fi</pre>
<p>Here trailing "<code class="literal">|| true</code>" was needed to ensure this shell script does not exit at this line accidentally when shell is invoked with "<code class="literal">-e</code>" flag.</p>
<div class="table">
<a name="listoffilecompartionalexpression"></a><p class="title"><b>Table 12.6. List of file comparison operators in the conditional expression</b></p>
<div class="table-contents"><table summary="List of file comparison operators in the conditional expression" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
equation
</th>
<th align="left">
condition to return logical true
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal"> -e &lt;file&gt; </code>
</td>
<td align="left">
&lt;file&gt; exists
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> -d &lt;file&gt; </code>
</td>
<td align="left">
&lt;file&gt; exists and is a directory
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> -f &lt;file&gt; </code>
</td>
<td align="left">
&lt;file&gt; exists and is a regular file
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> -w &lt;file&gt; </code>
</td>
<td align="left">
&lt;file&gt; exists and is writable
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> -x &lt;file&gt; </code>
</td>
<td align="left">
&lt;file&gt; exists and is executable
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;file1&gt; -nt &lt;file2&gt; </code>
</td>
<td align="left">
&lt;file1&gt; is newer than &lt;file2&gt; (modification)
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;file1&gt; -ot &lt;file2&gt; </code>
</td>
<td align="left">
&lt;file1&gt; is older than &lt;file2&gt; (modification)
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;file1&gt; -ef &lt;file2&gt; </code>
</td>
<td align="left">
&lt;file1&gt; and &lt;file2&gt; are on the same device and the same inode number
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><div class="table">
<a name="listofstringcomptionalexpression"></a><p class="title"><b>Table 12.7. List of string comparison operators in the conditional expression</b></p>
<div class="table-contents"><table summary="List of string comparison operators in the conditional expression" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
equation
</th>
<th align="left">
condition to return logical true
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal"> -z &lt;str&gt; </code>
</td>
<td align="left">
the length of &lt;str&gt; is zero
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> -n &lt;str&gt; </code>
</td>
<td align="left">
the length of &lt;str&gt; is non-zero
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;str1&gt; = &lt;str2&gt; </code>
</td>
<td align="left">
&lt;str1&gt; and &lt;str2&gt; are equal
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;str1&gt; != &lt;str2&gt; </code>
</td>
<td align="left">
&lt;str1&gt; and &lt;str2&gt; are not equal
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;str1&gt; &lt; &lt;str2&gt; </code>
</td>
<td align="left">
&lt;str1&gt; sorts before &lt;str2&gt; (locale dependent)
</td>
</tr>
<tr>
<td align="left">
<code class="literal"> &lt;str1&gt; &gt; &lt;str2&gt; </code>
</td>
<td align="left">
&lt;str1&gt; sorts after &lt;str2&gt; (locale dependent)
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p><span class="strong"><strong>Arithmetic</strong></span> integer comparison operators in the conditional expression are "<code class="literal">-eq</code>", "<code class="literal">-ne</code>", "<code class="literal">-lt</code>", "<code class="literal">-le</code>", "<code class="literal">-gt</code>", and "<code class="literal">-ge</code>".</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_shell_loops"></a>12.1.4. Shell loops</h3></div></div></div>
<p>There are several loop idioms to use in POSIX shell.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
"<code class="literal">for x in foo1 foo2 … ; do command ; done</code>" loops by assigning items from the list "<code class="literal">foo1 foo2 …</code>" to variable "<code class="literal">x</code>" and executing "<code class="literal">command</code>".
</p></li>
<li class="listitem"><p>
"<code class="literal">while condition ; do command ; done</code>" repeats "<code class="literal">command</code>" while "<code class="literal">condition</code>" is true.
</p></li>
<li class="listitem"><p>
"<code class="literal">until condition ; do command ; done</code>" repeats "<code class="literal">command</code>" while "<code class="literal">condition</code>" is not true.
</p></li>
<li class="listitem"><p>
"<code class="literal">break</code>" enables to exit from the loop.
</p></li>
<li class="listitem"><p>
"<code class="literal">continue</code>" enables to resume the next iteration of the loop.
</p></li>
</ul></div>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p>The <a class="ulink" href="http://en.wikipedia.org/wiki/C_(programming_language)" target="_top">C</a>-language like numeric iteration can be realized by using <span class="citerefentry"><span class="refentrytitle">seq</span>(1)</span> as the "<code class="literal">foo1 foo2 …</code>" generator.</p></td></tr>
</table></div>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p>See <a class="xref" href="ch09.en.html#_repeating_a_command_looping_over_files" title="9.5.9. Repeating a command looping over files">Section 9.5.9, “Repeating a command looping over files”</a>.</p></td></tr>
</table></div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_the_shell_command_line_processing_sequence"></a>12.1.5. The shell command-line processing sequence</h3></div></div></div>
<p>The shell processes a script roughly as the following sequence.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
The shell reads a line.
</p></li>
<li class="listitem"><p>
The shell groups a part of the line as <span class="strong"><strong>one token</strong></span> if it is within <code class="literal">"…"</code> or <code class="literal">'…'</code>.
</p></li>
<li class="listitem">
<p>
The shell splits other part of a line into <span class="strong"><strong>tokens</strong></span> by the following.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem"><p>
Whitespaces: <code class="literal">&lt;space&gt; &lt;tab&gt; &lt;newline&gt;</code>
</p></li>
<li class="listitem"><p>
Metacharacters: <code class="literal">&lt; &gt; | ; &amp; ( )</code>
</p></li>
</ul></div>
</li>
<li class="listitem">
<p>
The shell checks the <span class="strong"><strong>reserved word</strong></span> for each token to adjust its behavior if not within <code class="literal">"…"</code> or <code class="literal">'…'</code>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p><span class="strong"><strong>reserved word</strong></span>: <code class="literal">if then elif else fi for in while unless do done case esac</code></p></li></ul></div>
</li>
<li class="listitem"><p>
The shell expands <span class="strong"><strong>alias</strong></span> if not within <code class="literal">"…"</code> or <code class="literal">'…'</code>.
</p></li>
<li class="listitem">
<p>
The shell expands <span class="strong"><strong>tilde</strong></span> if not within <code class="literal">"…"</code> or <code class="literal">'…'</code>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem"><p>
"<code class="literal">~</code>" → current user's home directory
</p></li>
<li class="listitem"><p>
"<code class="literal">~&lt;user&gt;</code>" → <code class="literal">&lt;user&gt;</code>'s home directory
</p></li>
</ul></div>
</li>
<li class="listitem">
<p>
The shell expands <span class="strong"><strong>parameter</strong></span> to its value if not within <code class="literal">'…'</code>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p><span class="strong"><strong>parameter</strong></span>: "<code class="literal">$PARAMETER</code>" or "<code class="literal">${PARAMETER}</code>"
</p></li></ul></div>
</li>
<li class="listitem">
<p>
The shell expands <span class="strong"><strong>command substitution</strong></span> if not within <code class="literal">'…'</code>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem"><p>
"<code class="literal">$( command )</code>" → the output of "<code class="literal">command</code>"
</p></li>
<li class="listitem"><p>
"<code class="literal">` command `</code>" → the output of "<code class="literal">command</code>"
</p></li>
</ul></div>
</li>
<li class="listitem">
<p>
The shell expands <span class="strong"><strong>pathname glob</strong></span> to matching file names if not within <code class="literal">"…"</code> or <code class="literal">'…'</code>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem"><p><code class="literal">*</code> → any characters
</p></li>
<li class="listitem"><p><code class="literal">?</code> → one character
</p></li>
<li class="listitem"><p><code class="literal">[…]</code> → any one of the characters in "<code class="literal"></code>"
</p></li>
</ul></div>
</li>
<li class="listitem">
<p>
The shell looks up <span class="strong"><strong>command</strong></span> from the following and execute it.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem"><p><span class="strong"><strong>function</strong></span> definition
</p></li>
<li class="listitem"><p><span class="strong"><strong>builtin</strong></span> command
</p></li>
<li class="listitem"><p><span class="strong"><strong>executable file</strong></span> in "<code class="literal">$PATH</code>"
</p></li>
</ul></div>
</li>
<li class="listitem"><p>
The shell goes to the next line and repeats this process again from the top of this sequence.
</p></li>
</ul></div>
<p>Single quotes within double quotes have no effect.</p>
<p>Executing "<code class="literal">set -x</code>" in the shell or invoking the shell with "<code class="literal">-x</code>" option make the shell to print all of commands executed. This is quite handy for debugging.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_utility_programs_for_shell_script"></a>12.1.6. Utility programs for shell script</h3></div></div></div>
<p>In order to make your shell program as portable as possible across Debian system, it is good idea to limit utility programs to ones provided by <span class="strong"><strong>essential</strong></span> packages.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
"<code class="literal">aptitude search ~E</code>" lists <span class="strong"><strong>essential</strong></span> packages.
</p></li>
<li class="listitem"><p>
"<code class="literal">dpkg -L &lt;package_name&gt; |grep '/man/man.*/'</code>" lists manpages for commands offered by <code class="literal">&lt;package_name&gt;</code> package.
</p></li>
</ul></div>
<div class="table">
<a name="listofpackagescosforshellscripts"></a><p class="title"><b>Table 12.8. List of packages containing small utility programs for shell scripts</b></p>
<div class="table-contents"><table summary="List of packages containing small utility programs for shell scripts" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/coreutils" target="_top">
<code class="literal">coreutils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=coreutils" target="_top">http://qa.debian.org/popcon.php?package=coreutils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/c/coreutils.html" target="_top">14088</a></td>
<td align="left">
GNU core utilities
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/debianutils" target="_top">
<code class="literal">debianutils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=debianutils" target="_top">http://qa.debian.org/popcon.php?package=debianutils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/d/debianutils.html" target="_top">222</a></td>
<td align="left">
miscellaneous utilities specific to Debian
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/bsdmainutils" target="_top">
<code class="literal">bsdmainutils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=bsdmainutils" target="_top">http://qa.debian.org/popcon.php?package=bsdmainutils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/bsdmainutils.html" target="_top">558</a></td>
<td align="left">
collection of more utilities from FreeBSD
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/bsdutils" target="_top">
<code class="literal">bsdutils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=bsdutils" target="_top">http://qa.debian.org/popcon.php?package=bsdutils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/bsdutils.html" target="_top">187</a></td>
<td align="left">
basic utilities from 4.4BSD-Lite
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/moreutils" target="_top">
<code class="literal">moreutils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=moreutils" target="_top">http://qa.debian.org/popcon.php?package=moreutils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/m/moreutils.html" target="_top">147</a></td>
<td align="left">
additional Unix utilities
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p>Although <code class="literal">moreutils</code> may not exist ouside of Debian, it offers interesting small programs. Most notable one is <span class="citerefentry"><span class="refentrytitle">sponge</span>(8)</span> which is quite useful when you wish to overwrite original file.</p></td></tr>
</table></div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_shell_script_dialog"></a>12.1.7. Shell script dialog</h3></div></div></div>
<p>The user interface of a simple shell program can be improved from dull interaction by <code class="literal">echo</code> and <code class="literal">read</code> commands to more interactive one by using one of the so-called dialog program etc.</p>
<div class="table">
<a name="listofuserinterfaceprograms"></a><p class="title"><b>Table 12.9. List of user interface programs</b></p>
<div class="table-contents"><table summary="List of user interface programs" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/x11-utils" target="_top">
<code class="literal">x11-utils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=x11-utils" target="_top">http://qa.debian.org/popcon.php?package=x11-utils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/x/x11-utils.html" target="_top">554</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">xmessage</span>(1)</span>: display a message or query in a window (X)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/whiptail" target="_top">
<code class="literal">whiptail</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=whiptail" target="_top">http://qa.debian.org/popcon.php?package=whiptail</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/w/whiptail.html" target="_top">87</a></td>
<td align="left">
displays user-friendly dialog boxes from shell scripts (newt)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/dialog" target="_top">
<code class="literal">dialog</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=dialog" target="_top">http://qa.debian.org/popcon.php?package=dialog</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/d/dialog.html" target="_top">1230</a></td>
<td align="left">
displays user-friendly dialog boxes from shell scripts (ncurses)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/zenity" target="_top">
<code class="literal">zenity</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=zenity" target="_top">http://qa.debian.org/popcon.php?package=zenity</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/z/zenity.html" target="_top">324</a></td>
<td align="left">
display graphical dialog boxes from shell scripts (gtk2.0)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/ssft" target="_top">
<code class="literal">ssft</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=ssft" target="_top">http://qa.debian.org/popcon.php?package=ssft</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/s/ssft.html" target="_top">152</a></td>
<td align="left">
Shell Scripts Frontend Tool (wrapper for zenity, kdialog, and dialog with gettext)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/gettext" target="_top">
<code class="literal">gettext</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=gettext" target="_top">http://qa.debian.org/popcon.php?package=gettext</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/g/gettext.html" target="_top">6355</a></td>
<td align="left">
"<code class="literal">/usr/bin/gettext.sh</code>": translate message
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_shell_script_example_with_zenity"></a>12.1.8. Shell script example with zenity</h3></div></div></div>
<p>Here is a simple script which creates ISO image with RS02 data supplemented by <span class="citerefentry"><span class="refentrytitle">dvdisaster</span>(1)</span>.</p>
<pre class="screen">#!/bin/sh -e
# gmkrs02 : Copyright (C) 2007 Osamu Aoki &lt;osamu@debian.org&gt;, Public Domain
#set -x
error_exit()
{
echo "$1" &gt;&amp;2
exit 1
}
# Initialize variables
DATA_ISO="$HOME/Desktop/iso-$$.img"
LABEL=$(date +%Y%m%d-%H%M%S-%Z)
if [ $# != 0 ] &amp;&amp; [ -d "$1" ]; then
DATA_SRC="$1"
else
# Select directory for creating ISO image from folder on desktop
DATA_SRC=$(zenity --file-selection --directory \
--title="Select the directory tree root to create ISO image") \
|| error_exit "Exit on directory selection"
fi
# Check size of archive
xterm -T "Check size $DATA_SRC" -e du -s $DATA_SRC/*
SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024))
if [ $SIZE -le 520 ] ; then
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="The data size is good for CD backup:\\n $SIZE MB"
elif [ $SIZE -le 3500 ]; then
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="The data size is good for DVD backup :\\n $SIZE MB"
else
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="The data size is too big to backup : $SIZE MB"
error_exit "The data size is too big to backup :\\n $SIZE MB"
fi
# only xterm is sure to have working -e option
# Create raw ISO image
rm -f "$DATA_ISO" || true
xterm -T "genisoimage $DATA_ISO" \
-e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC"
# Create RS02 supplemental redundancy
xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c
zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
--text="ISO/RS02 data ($SIZE MB) \\n created at: $DATA_ISO"
# EOF</pre>
<p>You may wish to create launcher on the desktop with command set something like "<code class="literal">/usr/local/bin/gmkrs02 %d</code>".</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_make"></a>12.2. Make</h2></div></div></div>
<p><a class="ulink" href="http://en.wikipedia.org/wiki/Make_(software)" target="_top">Make</a> is a utility to maintain groups of programs. Upon execution of <span class="citerefentry"><span class="refentrytitle">make</span>(1)</span>, <code class="literal">make</code> read the rule file, "<code class="literal">Makefile</code>", and updates a target if it depends on prerequisite files that have been modified since the target was last modified, or if the target does not exist. The execution of these updates may occur concurrently.</p>
<p>The rule file syntax is the following.</p>
<pre class="screen">target: [ prerequisites ... ]
[TAB] command1
[TAB] -command2 # ignore errors
[TAB] @command3 # suppress echoing</pre>
<p>Here "<code class="literal"> [TAB] </code>" is a TAB code. Each line is interpreted by the shell after make variable substitution. Use "<code class="literal">\</code>" at the end of a line to continue the script. Use "<code class="literal">$$</code>" to enter "<code class="literal">$</code>" for environment values for a shell script.</p>
<p>Implicit rules for the target and prerequisites can be written, for example, by the following.</p>
<pre class="screen">%.o: %.c header.h</pre>
<p>Here, the target contains the character "<code class="literal">%</code>" (exactly one of them). The "<code class="literal">%</code>" can match any nonempty substring in the actual target filenames. The prerequisites likewise use "<code class="literal">%</code>" to show how their names relate to the actual target name.</p>
<div class="table">
<a name="listofmakeautomaticvariables"></a><p class="title"><b>Table 12.10. List of make automatic variables</b></p>
<div class="table-contents"><table summary="List of make automatic variables" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
automatic variable
</th>
<th align="left">
value
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">$@</code>
</td>
<td align="left">
target
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$&lt;</code>
</td>
<td align="left">
first prerequisite
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$?</code>
</td>
<td align="left">
all newer prerequisites
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$^</code>
</td>
<td align="left">
all prerequisites
</td>
</tr>
<tr>
<td align="left">
<code class="literal">$*</code>
</td>
<td align="left">
"<code class="literal">%</code>" matched stem in the target pattern
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><div class="table">
<a name="listofmakevariableexpansions"></a><p class="title"><b>Table 12.11. List of make variable expansions</b></p>
<div class="table-contents"><table summary="List of make variable expansions" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
variable expansion
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">foo1 := bar</code>
</td>
<td align="left">
one-time expansion
</td>
</tr>
<tr>
<td align="left">
<code class="literal">foo2 = bar</code>
</td>
<td align="left">
recursive expansion
</td>
</tr>
<tr>
<td align="left">
<code class="literal">foo3 += bar</code>
</td>
<td align="left">
append
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>Run "<code class="literal">make -p -f/dev/null</code>" to see automatic internal rules.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_c"></a>12.3. C</h2></div></div></div>
<p>You can set up proper environment to compile programs written in the <a class="ulink" href="http://en.wikipedia.org/wiki/C_(programming_language)" target="_top">C programming language</a> by the following.</p>
<pre class="screen"># apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential</pre>
<p>The <code class="literal">libc6-dev</code> package, i.e., GNU C Library, provides <a class="ulink" href="http://en.wikipedia.org/wiki/C_standard_library" target="_top">C standard library</a> which is collection of header files and library routines used by the C programming language.</p>
<p>See references for C as the following.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
"<code class="literal">info libc</code>" (C library function reference)
</p></li>
<li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">gcc</span>(1)</span> and "<code class="literal">info gcc</code>"
</p></li>
<li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">each_C_library_function_name</span>(3)</span>
</p></li>
<li class="listitem"><p>
Kernighan &amp; Ritchie, "The C Programming Language", 2nd edition (Prentice Hall)
</p></li>
</ul></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_simple_c_program_gcc"></a>12.3.1. Simple C program (gcc)</h3></div></div></div>
<p>A simple example "<code class="literal">example.c</code>" can compiled with a library "<code class="literal">libm</code>" into an executable "<code class="literal">run_example</code>" by the following.</p>
<pre class="screen">$ cat &gt; example.c &lt;&lt; EOF
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
#include &lt;string.h&gt;
int main(int argc, char **argv, char **envp){
double x;
char y[11];
x=sqrt(argc+7.5);
strncpy(y, argv[0], 10); /* prevent buffer overflow */
y[10] = '\0'; /* fill to make sure string ends with '\0' */
printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
return 0;
}
EOF
$ gcc -Wall -g -o run_example example.c -lm
$ ./run_example
1, 2.915, ./run_exam, (null)
$ ./run_example 1234567890qwerty
2, 3.082, ./run_exam, 1234567890qwerty</pre>
<p>Here, "<code class="literal">-lm</code>" is needed to link library "<code class="literal">/usr/lib/libm.so</code>" from the <code class="literal">libc6</code> package for <span class="citerefentry"><span class="refentrytitle">sqrt</span>(3)</span>. The actual library is in "<code class="literal">/lib/</code>" with filename "<code class="literal">libm.so.6</code>", which is a symlink to "<code class="literal">libm-2.7.so</code>".</p>
<p>Look at the last parameter in the output text. There are more than 10 characters even though "<code class="literal">%10s</code>" is specified.</p>
<p>The use of pointer memory operation functions without boundary checks, such as <span class="citerefentry"><span class="refentrytitle">sprintf</span>(3)</span> and <span class="citerefentry"><span class="refentrytitle">strcpy</span>(3)</span>, is deprecated to prevent buffer overflow exploits that leverage the above overrun effects. Instead, use <span class="citerefentry"><span class="refentrytitle">snprintf</span>(3)</span> and <span class="citerefentry"><span class="refentrytitle">strncpy</span>(3)</span>.</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_debug"></a>12.4. Debug</h2></div></div></div>
<p>Debug is important part of programing activities. Knowing how to debug programs makes you a good Debian user who can produce meaningful bug reports.</p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_basic_gdb_execution"></a>12.4.1. Basic gdb execution</h3></div></div></div>
<p>Primary <a class="ulink" href="http://en.wikipedia.org/wiki/Debugger" target="_top">debugger</a> on Debian is <span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span> which enables you to inspect a program while it executes.</p>
<p>Let's install <code class="literal">gdb</code> and related programs by the following.</p>
<pre class="screen"># apt-get install gdb gdb-doc build-essential devscripts</pre>
<p>Good tutorial of <code class="literal">gdb</code> is provided by "<code class="literal">info gdb</code>" or found <a class="ulink" href="http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html" target="_top">elsewhere on the web</a>.
Here is a simple example of using <span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span> on a "<code class="literal">program</code>" compiled with the "<code class="literal">-g</code>" option to produce debugging information.</p>
<pre class="screen">$ gdb program
(gdb) b 1 # set break point at line 1
(gdb) run args # run program with args
(gdb) next # next line
...
(gdb) step # step forward
...
(gdb) p parm # print parm
...
(gdb) p parm=12 # set value to 12
...
(gdb) quit</pre>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p>Many <span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span> commands can be abbreviated. Tab expansion works as in the shell.</p></td></tr>
</table></div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_debugging_the_debian_package"></a>12.4.2. Debugging the Debian package</h3></div></div></div>
<p>Since all installed binaries should be stripped on the Debian system by default, most debugging symbols are removed in the normal package. In order to debug Debian packages with <span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span>, corresponding <code class="literal">*-dbg</code> packages need to be installed (e.g. <code class="literal">libc6-dbg</code> in the case of <code class="literal">libc6</code>).</p>
<p>If a package to be debugged does not provide its <code class="literal">*-dbg</code> package, you need to install it after rebuilding it by the following.</p>
<pre class="screen">$ mkdir /path/new ; cd /path/new
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install fakeroot devscripts build-essential
$ sudo apt-get build-dep source_package_name
$ apt-get source package_name
$ cd package_name*</pre>
<p>Fix bugs if needed.</p>
<p>Bump package version to one which does not collide with official Debian versions, e.g. one appended with "<code class="literal">+debug1</code>" when recompiling existing package version, or one appended with "<code class="literal">~pre1</code>" when compiling unreleased package version by the following.</p>
<pre class="screen">$ dch -i</pre>
<p>Compile and install packages with debug symbols by the following.</p>
<pre class="screen">$ export DEB_BUILD_OPTIONS=nostrip,noopt
$ debuild
$ cd ..
$ sudo debi package_name*.changes</pre>
<p>You need to check build scripts of the package and ensure to use "<code class="literal">CFLAGS=-g -Wall</code>" for compiling binaries.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_obtaining_backtrace"></a>12.4.3. Obtaining backtrace</h3></div></div></div>
<p>When you encounter program crash, reporting bug report with cut-and-pasted backtrace information is a good idea.</p>
<p>The backtrace can be obtained by the following steps.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
Run the program under <span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span>.
</p></li>
<li class="listitem">
<p>
Reproduce crash.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>
It causes you to be dropped back to the <code class="literal">gdb</code> prompt.
</p></li></ul></div>
</li>
<li class="listitem"><p>
Type "<code class="literal">bt</code>" at the <code class="literal">gdb</code> prompt.
</p></li>
</ul></div>
<p>In case of program freeze, you can crash the program by pressing <code class="literal">Ctrl-C</code> in the terminal running <code class="literal">gdb</code> to obtain <code class="literal">gdb</code> prompt.</p>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Tip">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="images/tip.png"></td>
<th align="left">Tip</th>
</tr>
<tr><td align="left" valign="top"><p>Often, you see a backtrace where one or more of the top lines are in "<code class="literal">malloc()</code>" or "<code class="literal">g_malloc()</code>". When this happens, chances are your backtrace isn't very useful. The easiest way to find some useful information is to set the environment variable "<code class="literal">$MALLOC_CHECK_</code>" to a value of 2 (<span class="citerefentry"><span class="refentrytitle">malloc</span>(3)</span>). You can do this while running <code class="literal">gdb</code> by doing the following.</p></td></tr>
</table></div>
<pre class="screen"> $ MALLOC_CHECK_=2 gdb hello</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_advanced_gdb_commands"></a>12.4.4. Advanced gdb commands</h3></div></div></div>
<div class="table">
<a name="listofadvancedgdbcommands"></a><p class="title"><b>Table 12.12. List of advanced gdb commands</b></p>
<div class="table-contents"><table summary="List of advanced gdb commands" border="1">
<colgroup>
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
command
</th>
<th align="left">
description for command objectives
</th>
</tr></thead>
<tbody>
<tr>
<td align="left">
<code class="literal">(gdb) thread apply all bt</code>
</td>
<td align="left">
get a backtrace for all threads for multi-threaded program
</td>
</tr>
<tr>
<td align="left">
<code class="literal">(gdb) bt full</code>
</td>
<td align="left">
get parameters came on the stack of function calls
</td>
</tr>
<tr>
<td align="left">
<code class="literal">(gdb) thread apply all bt full</code>
</td>
<td align="left">
get a backtrace and parameters as the combination of the preceding options
</td>
</tr>
<tr>
<td align="left">
<code class="literal">(gdb) thread apply all bt full 10</code>
</td>
<td align="left">
get a backtrace and parameters for top 10 calls to cut off irrelevant output
</td>
</tr>
<tr>
<td align="left">
<code class="literal">(gdb) set logging on</code>
</td>
<td align="left">
write log of <code class="literal">gdb</code> output to a file (the default is "<code class="literal">gdb.txt</code>")
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_debugging_x_errors"></a>12.4.5. Debugging X Errors</h3></div></div></div>
<p>If a GNOME program <code class="literal">preview1</code> has received an X error, you should see a message as follows.</p>
<pre class="screen">The program 'preview1' received an X Window System error.</pre>
<p>If this is the case, you can try running the program with "<code class="literal">--sync</code>", and break on the "<code class="literal">gdk_x_error</code>" function in order to obtain a backtrace.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_check_dependency_on_libraries"></a>12.4.6. Check dependency on libraries</h3></div></div></div>
<p>Use <span class="citerefentry"><span class="refentrytitle">ldd</span>(1)</span> to find out a program's dependency on libraries by the followings.</p>
<pre class="screen">$ ldd /bin/ls
librt.so.1 =&gt; /lib/librt.so.1 (0x4001e000)
libc.so.6 =&gt; /lib/libc.so.6 (0x40030000)
libpthread.so.0 =&gt; /lib/libpthread.so.0 (0x40153000)
/lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x40000000)</pre>
<p>For <span class="citerefentry"><span class="refentrytitle">ls</span>(1)</span> to work in a `chroot`ed environment, the above libraries must be available in your `chroot`ed environment.</p>
<p>See <a class="xref" href="ch09.en.html#_tracing_program_activities" title="9.5.6. Tracing program activities">Section 9.5.6, “Tracing program activities”</a>.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_memory_leak_detection_tools"></a>12.4.7. Memory leak detection tools</h3></div></div></div>
<p>There are several memory leak detection tools available in Debian.</p>
<div class="table">
<a name="listofmemoryleakdetectiontools"></a><p class="title"><b>Table 12.13. List of memory leak detection tools</b></p>
<div class="table-contents"><table summary="List of memory leak detection tools" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/libc6-dev" target="_top">
<code class="literal">libc6-dev</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=libc6-dev" target="_top">http://qa.debian.org/popcon.php?package=libc6-dev</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/libc/libc6-dev.html" target="_top">10555</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">mtrace</span>(1)</span>: malloc debugging functionality in glibc
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/valgrind" target="_top">
<code class="literal">valgrind</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=valgrind" target="_top">http://qa.debian.org/popcon.php?package=valgrind</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/v/valgrind.html" target="_top">94878</a></td>
<td align="left">
memory debugger and profiler
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/kmtrace" target="_top">
<code class="literal">kmtrace</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=kmtrace" target="_top">http://qa.debian.org/popcon.php?package=kmtrace</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/k/kmtrace.html" target="_top">264</a></td>
<td align="left">
KDE memory leak tracer using glibc's <span class="citerefentry"><span class="refentrytitle">mtrace</span>(1)</span>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/alleyoop" target="_top">
<code class="literal">alleyoop</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=alleyoop" target="_top">http://qa.debian.org/popcon.php?package=alleyoop</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/a/alleyoop.html" target="_top">948</a></td>
<td align="left">
GNOME front-end to the Valgrind memory checker
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/electric-fence" target="_top">
<code class="literal">electric-fence</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=electric-fence" target="_top">http://qa.debian.org/popcon.php?package=electric-fence</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/e/electric-fence.html" target="_top">46</a></td>
<td align="left">
<span class="citerefentry"><span class="refentrytitle">malloc</span>(3)</span> debugger
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/leaktracer" target="_top">
<code class="literal">leaktracer</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=leaktracer" target="_top">http://qa.debian.org/popcon.php?package=leaktracer</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/l/leaktracer.html" target="_top">116</a></td>
<td align="left">
memory-leak tracer for C++ programs
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/libdmalloc5" target="_top">
<code class="literal">libdmalloc5</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=libdmalloc5" target="_top">http://qa.debian.org/popcon.php?package=libdmalloc5</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/libd/libdmalloc5.html" target="_top">325</a></td>
<td align="left">
debug memory allocation library
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_static_code_analysis_tools"></a>12.4.8. Static code analysis tools</h3></div></div></div>
<p>There are <a class="ulink" href="http://en.wikipedia.org/wiki/Lint_programming_tool" target="_top">lint</a> like tools for <a class="ulink" href="http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis" target="_top">static code analysis</a>.</p>
<div class="table">
<a name="listoftoolsforstaticcodeanalysis"></a><p class="title"><b>Table 12.14. List of tools for static code analysis</b></p>
<div class="table-contents"><table summary="List of tools for static code analysis" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/splint" target="_top">
<code class="literal">splint</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=splint" target="_top">http://qa.debian.org/popcon.php?package=splint</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/s/splint.html" target="_top">1836</a></td>
<td align="left">
tool for statically checking C programs for bugs
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/rats" target="_top">
<code class="literal">rats</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=rats" target="_top">http://qa.debian.org/popcon.php?package=rats</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/r/rats.html" target="_top">876</a></td>
<td align="left">
rough Auditing Tool for Security (C, C++, PHP, Perl, and Python code)
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/flawfinder" target="_top">
<code class="literal">flawfinder</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=flawfinder" target="_top">http://qa.debian.org/popcon.php?package=flawfinder</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/f/flawfinder.html" target="_top">188</a></td>
<td align="left">
tool to examine C/C++ source code and looks for security weaknesses
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/perl" target="_top">
<code class="literal">perl</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=perl" target="_top">http://qa.debian.org/popcon.php?package=perl</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/p/perl.html" target="_top">17077</a></td>
<td align="left">
interpreter with internal static code checker: <span class="citerefentry"><span class="refentrytitle">B::Lint</span>(3perl)</span>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/pylint" target="_top">
<code class="literal">pylint</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=pylint" target="_top">http://qa.debian.org/popcon.php?package=pylint</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/p/pylint.html" target="_top">416</a></td>
<td align="left">
Python code static checker
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/jlint" target="_top">
<code class="literal">jlint</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=jlint" target="_top">http://qa.debian.org/popcon.php?package=jlint</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/j/jlint.html" target="_top">156</a></td>
<td align="left">
Java program checker
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/weblint-perl" target="_top">
<code class="literal">weblint-perl</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=weblint-perl" target="_top">http://qa.debian.org/popcon.php?package=weblint-perl</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/w/weblint-perl.html" target="_top">57</a></td>
<td align="left">
syntax and minimal style checker for HTML
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/linklint" target="_top">
<code class="literal">linklint</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=linklint" target="_top">http://qa.debian.org/popcon.php?package=linklint</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/l/linklint.html" target="_top">432</a></td>
<td align="left">
fast link checker and web site maintenance tool
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/libxml2-utils" target="_top">
<code class="literal">libxml2-utils</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=libxml2-utils" target="_top">http://qa.debian.org/popcon.php?package=libxml2-utils</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/libx/libxml2-utils.html" target="_top">139</a></td>
<td align="left">
utilities with <span class="citerefentry"><span class="refentrytitle">xmllint</span>(1)</span> to validate XML files
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_disassemble_binary"></a>12.4.9. Disassemble binary</h3></div></div></div>
<p>You can disassemble binary code with <span class="citerefentry"><span class="refentrytitle">objdump</span>(1)</span> by the following.</p>
<pre class="screen">$ objdump -m i386 -b binary -D /usr/lib/grub/x86_64-pc/stage1</pre>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p><span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span> may be used to disassemble code interactively.</p></td></tr>
</table></div>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_flex_8212_a_better_lex"></a>12.5. Flex — a better Lex</h2></div></div></div>
<p><a class="ulink" href="http://en.wikipedia.org/wiki/Flex_lexical_analyser" target="_top">Flex</a> is a <a class="ulink" href="http://en.wikipedia.org/wiki/Lex_programming_tool" target="_top">Lex</a>-compatible fast <a class="ulink" href="http://en.wikipedia.org/wiki/Lexical_analysis" target="_top">lexical analyzer</a> generator.</p>
<p>Tutorial for <span class="citerefentry"><span class="refentrytitle">flex</span>(1)</span> can be found in "<code class="literal">info flex</code>".</p>
<p>You need to provide your own "<code class="literal">main()</code>" and "<code class="literal">yywrap()</code>". Otherwise, your flex program should look like this to compile without a library. This is because that "<code class="literal">yywrap</code>" is a macro and "<code class="literal">%option main</code>" turns on "<code class="literal">%option noyywrap</code>" implicitly.</p>
<pre class="screen">%option main
%%
.|\n ECHO ;
%%</pre>
<p>Alternatively, you may compile with the "<code class="literal">-lfl</code>" linker option at the end of your <span class="citerefentry"><span class="refentrytitle">cc</span>(1)</span> command line (like AT&amp;T-Lex with "<code class="literal">-ll</code>"). No "<code class="literal">%option</code>" is needed in this case.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_bison_8212_a_better_yacc"></a>12.6. Bison — a better Yacc</h2></div></div></div>
<p>Several packages provide a <a class="ulink" href="http://en.wikipedia.org/wiki/Yacc" target="_top">Yacc</a>-compatible lookahead <a class="ulink" href="http://en.wikipedia.org/wiki/LR_parser" target="_top">LR parser</a> or <a class="ulink" href="http://en.wikipedia.org/wiki/LALR_parser" target="_top">LALR parser</a> generator in Debian.</p>
<div class="table">
<a name="listofyacccompatparsergenerators"></a><p class="title"><b>Table 12.15. List of Yacc-compatible LALR parser generators</b></p>
<div class="table-contents"><table summary="List of Yacc-compatible LALR parser generators" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/bison" target="_top">
<code class="literal">bison</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=bison" target="_top">http://qa.debian.org/popcon.php?package=bison</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/bison.html" target="_top">1518</a></td>
<td align="left">
<a class="ulink" href="http://en.wikipedia.org/wiki/GNU_bison" target="_top">GNU LALR parser generator</a>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/byacc" target="_top">
<code class="literal">byacc</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=byacc" target="_top">http://qa.debian.org/popcon.php?package=byacc</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/byacc.html" target="_top">143</a></td>
<td align="left">
Berkeley LALR parser generator
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/btyacc" target="_top">
<code class="literal">btyacc</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=btyacc" target="_top">http://qa.debian.org/popcon.php?package=btyacc</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/b/btyacc.html" target="_top">248</a></td>
<td align="left">
backtracking parser generator based on <code class="literal">byacc</code>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>Tutorial for <span class="citerefentry"><span class="refentrytitle">bison</span>(1)</span> can be found in "<code class="literal">info bison</code>".</p>
<p>You need to provide your own "<code class="literal">main()</code>" and "<code class="literal">yyerror()</code>". "<code class="literal">main()</code>" calls "<code class="literal">yyparse()</code>" which calls "<code class="literal">yylex()</code>", usually created with Flex.</p>
<pre class="screen">%%
%%</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_autoconf"></a>12.7. Autoconf</h2></div></div></div>
<p><a class="ulink" href="http://en.wikipedia.org/wiki/Autoconf" target="_top">Autoconf</a> is a tool for producing shell scripts that automatically configure software source code packages to adapt to many kinds of Unix-like systems using the entire GNU build system.</p>
<p><span class="citerefentry"><span class="refentrytitle">autoconf</span>(1)</span> produces the configuration script "<code class="literal">configure</code>". "<code class="literal">configure</code>" automatically creates a customized "<code class="literal">Makefile</code>" using the "<code class="literal">Makefile.in</code>" template.</p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_compile_and_install_a_program"></a>12.7.1. Compile and install a program</h3></div></div></div>
<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>Do not overwrite system files with your compiled programs when installing them.</p></td></tr>
</table></div>
<p>Debian does not touch files in "<code class="literal">/usr/local/</code>" or "<code class="literal">/opt</code>". So if you compile a program from source, install it into "<code class="literal">/usr/local/</code>" so it does not interfere with Debian.</p>
<pre class="screen">$ cd src
$ ./configure --prefix=/usr/local
$ make
$ make install # this puts the files in the system</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="_uninstall_program"></a>12.7.2. Uninstall program</h3></div></div></div>
<p>If you have the original source and if it uses <span class="citerefentry"><span class="refentrytitle">autoconf</span>(1)</span>/<span class="citerefentry"><span class="refentrytitle">automake</span>(1)</span> and if you can remember how you configured it, execute as follows to uninstall the program.</p>
<pre class="screen">$ ./configure "all-of-the-options-you-gave-it"
# make uninstall</pre>
<p>Alternatively, if you are absolutely sure that the install process puts files only under "<code class="literal">/usr/local/</code>" and there is nothing important there, you can erase all its contents by the following.</p>
<pre class="screen"># find /usr/local -type f -print0 | xargs -0 rm -f</pre>
<p>If you are not sure where files are installed, you should consider using <span class="citerefentry"><span class="refentrytitle">checkinstall</span>(8)</span> from the <code class="literal">checkinstall</code> package, which provides a clean path for the uninstall. It now supports to create a Debian package with "<code class="literal">-D</code>" option.</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_perl_short_script_madness"></a>12.8. Perl short script madness</h2></div></div></div>
<p>Although any <a class="ulink" href="http://en.wikipedia.org/wiki/AWK" target="_top">AWK</a> scripts can be automatically rewritten in <a class="ulink" href="http://en.wikipedia.org/wiki/Perl" target="_top">Perl</a> using <span class="citerefentry"><span class="refentrytitle">a2p</span>(1)</span>, one-liner AWK scripts are best converted to one-liner Perl scripts manually.</p>
<p>Let's think following AWK script snippet.</p>
<pre class="screen">awk '($2=="1957") { print $3 }' |</pre>
<p>This is equivalent to any one of the following lines.</p>
<pre class="screen">perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |</pre>
<pre class="screen">perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |</pre>
<pre class="screen">perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |</pre>
<pre class="screen">perl -lane 'print $F[2] if $F[1] eq "1957"' |</pre>
<pre class="screen">perl -lane 'print$F[2]if$F[1]eq+1957' |</pre>
<p>The last one is a riddle. It took advantage of following Perl features.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
The whitespace is optional.
</p></li>
<li class="listitem"><p>
The automatic conversion exists from number to the string.
</p></li>
</ul></div>
<p>See <span class="citerefentry"><span class="refentrytitle">perlrun</span>(1)</span> for the command-line options. For more crazy Perl scripts, <a class="ulink" href="http://perlgolf.sourceforge.net" target="_top">Perl Golf</a> may be interesting.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_web"></a>12.9. Web</h2></div></div></div>
<p>Basic interactive dynamic web pages can be made as follows.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
Queries are presented to the browser user using <a class="ulink" href="http://en.wikipedia.org/wiki/HTML" target="_top">HTML</a> forms.
</p></li>
<li class="listitem">
<p>
Filling and clicking on the form entries sends one of the following <a class="ulink" href="http://en.wikipedia.org/wiki/Uniform_Resource_Locator" target="_top">URL</a> string with encoded parameters from the browser to the web server.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem"><p>
"<code class="literal">http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&amp;VAR2=VAL2&amp;VAR3=VAL3</code>"
</p></li>
<li class="listitem"><p>
"<code class="literal">http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&amp;VAR2=VAL2&amp;VAR3=VAL3</code>"
</p></li>
<li class="listitem"><p>
"<code class="literal">http://www.foo.dom/program.php?VAR1=VAL1&amp;VAR2=VAL2&amp;VAR3=VAL3</code>"
</p></li>
</ul></div>
</li>
<li class="listitem"><p>
"<code class="literal">%nn</code>" in URL is replaced with a character with hexadecimal <code class="literal">nn</code> value.
</p></li>
<li class="listitem"><p>
The environment variable is set as: "<code class="literal">QUERY_STRING="VAR1=VAL1 VAR2=VAL2 VAR3=VAL3"</code>".
</p></li>
<li class="listitem"><p><a class="ulink" href="http://en.wikipedia.org/wiki/Common_Gateway_Interface" target="_top">CGI</a> program (any one of "<code class="literal">program.*</code>") on the web server executes itself with the environment variable "<code class="literal">$QUERY_STRING</code>".
</p></li>
<li class="listitem"><p><code class="literal">stdout</code> of CGI program is sent to the web browser and is presented as an interactive dynamic web page.
</p></li>
</ul></div>
<p>For security reasons it is better not to hand craft new hacks for parsing CGI parameters. There are established modules for them in Perl and Python. <a class="ulink" href="http://en.wikipedia.org/wiki/PHP" target="_top">PHP</a> comes with these functionalities. When client data storage is needed, <a class="ulink" href="http://en.wikipedia.org/wiki/HTTP_cookie" target="_top">HTTP cookies</a> are used. When client side data processing is needed, <a class="ulink" href="http://en.wikipedia.org/wiki/JavaScript" target="_top">Javascript</a> is frequently used.</p>
<p>For more, see the <a class="ulink" href="http://en.wikipedia.org/wiki/Common_Gateway_Interface" target="_top">Common Gateway Interface</a>, <a class="ulink" href="http://en.wikipedia.org/wiki/Apache_Software_Foundation" target="_top">The Apache Software Foundation</a>, and <a class="ulink" href="http://en.wikipedia.org/wiki/JavaScript" target="_top">JavaScript</a>.</p>
<p>Searching "CGI tutorial" on Google by typing encoded URL <a class="ulink" href="http://www.google.com/search?hl=en&amp;ie=UTF-8&amp;q=CGI+tutorial" target="_top">http://www.google.com/search?hl=en&amp;ie=UTF-8&amp;q=CGI+tutorial</a> directly to the browser address is a good way to see the CGI script in action on the Google server.</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_the_source_code_translation"></a>12.10. The source code translation</h2></div></div></div>
<p>There are programs to convert source codes.</p>
<div class="table">
<a name="listofsourcecodetranslationtools"></a><p class="title"><b>Table 12.16. List of source code translation tools</b></p>
<div class="table-contents"><table summary="List of source code translation tools" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">
package
</th>
<th align="left">
popcon
</th>
<th align="left">
size
</th>
<th align="left">
keyword
</th>
<th align="left">
description
</th>
</tr></thead>
<tbody>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/perl" target="_top">
<code class="literal">perl</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=perl" target="_top">http://qa.debian.org/popcon.php?package=perl</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/p/perl.html" target="_top">17077</a></td>
<td align="left">
AWK→PERL
</td>
<td align="left">
convert source codes from AWK to PERL: <span class="citerefentry"><span class="refentrytitle">a2p</span>(1)</span>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/f2c" target="_top">
<code class="literal">f2c</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=f2c" target="_top">http://qa.debian.org/popcon.php?package=f2c</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/f/f2c.html" target="_top">424</a></td>
<td align="left">
FORTRAN→C
</td>
<td align="left">
convert source codes from FORTRAN 77 to C/C++: <span class="citerefentry"><span class="refentrytitle">f2c</span>(1)</span>
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/protoize" target="_top">
<code class="literal">protoize</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=protoize" target="_top">http://qa.debian.org/popcon.php?package=protoize</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/p/protoize.html" target="_top">125</a></td>
<td align="left">
ANSI C
</td>
<td align="left">
create/remove ANSI prototypes from C code
</td>
</tr>
<tr>
<td align="left"><a class="ulink" href="http://packages.debian.org/sid/intel2gas" target="_top">
<code class="literal">intel2gas</code>
</a></td>
<td align="left"><a class="ulink" href="http://qa.debian.org/popcon.php?package=intel2gas" target="_top">http://qa.debian.org/popcon.php?package=intel2gas</a></td>
<td align="left"><a class="ulink" href="http://packages.qa.debian.org/i/intel2gas.html" target="_top">72</a></td>
<td align="left">
intel→gas
</td>
<td align="left">
converter from NASM (Intel format) to the GNU Assembler (GAS)
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="_making_debian_package"></a>12.11. Making Debian package</h2></div></div></div>
<p>If you want to make a Debian package, read followings.</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p><a class="xref" href="ch02.en.html" title="Chapter 2. Debian package management">Chapter 2, <i>Debian package management</i></a> to understand the basic package system
</p></li>
<li class="listitem"><p><a class="xref" href="ch02.en.html#_porting_a_package_to_the_stable_system" title="2.7.13. Porting a package to the stable system">Section 2.7.13, “Porting a package to the stable system”</a> to understand basic porting process
</p></li>
<li class="listitem"><p><a class="xref" href="ch09.en.html#_chroot_system" title="9.8.4. Chroot system">Section 9.8.4, “Chroot system”</a> to understand basic chroot techniques
</p></li>
<li class="listitem"><p><span class="citerefentry"><span class="refentrytitle">debuild</span>(1)</span>, <span class="citerefentry"><span class="refentrytitle">pbuilder</span>(1)</span> and <span class="citerefentry"><span class="refentrytitle">pdebuild</span>(1)</span>
</p></li>
<li class="listitem"><p><a class="xref" href="ch12.en.html#_debugging_the_debian_package" title="12.4.2. Debugging the Debian package">Section 12.4.2, “Debugging the Debian package”</a> for recompiling for debugging
</p></li>
<li class="listitem"><p><a class="ulink" href="http://www.debian.org/doc/manuals/maint-guide/" target="_top">Debian New Maintainers' Guide</a> as tutorial (the <code class="literal">maint-guide</code> package)
</p></li>
<li class="listitem"><p><a class="ulink" href="http://www.debian.org/doc/manuals/developers-reference/" target="_top">Debian Developer's Reference</a> (the <code class="literal">developers-reference</code> package)
</p></li>
<li class="listitem"><p><a class="ulink" href="http://www.debian.org/doc/debian-policy/" target="_top">Debian Policy Manual</a> (the <code class="literal">debian-policy</code> package)
</p></li>
</ul></div>
<p>There are packages such as <code class="literal">dh-make</code>, <code class="literal">dh-make-perl</code>, etc., which help packaging.</p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="ch11.en.html"><img src="images/prev.gif" alt="Prev"></a> </td>
<td width="20%" align="center"> </td>
<td width="40%" align="right"> <a accesskey="n" href="apa.en.html"><img src="images/next.gif" alt="Next"></a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Chapter 11. Data conversion </td>
<td width="20%" align="center"><a accesskey="h" href="index.en.html"><img src="images/home.gif" alt="Home"></a></td>
<td width="40%" align="right" valign="top"> Appendix A. Appendix</td>
</tr>
</table>
</div>
</body>
</html>