to put together a short shell script that emulates the basic functionality of more. The BASH(1) manpage and
Adv−BASH−Scripting−Guide will serve as references.
8.2.2. More device files
The more script will need access to device files that are not on the root disk yet. Specifically more needs to
have
stdin
,
stdout
and
stderr
, but while we are at it we should check for any other missing
/dev
files.
The Linux Standard Base requires
null
,
zero
and
tty
to be present in the
/dev
directory. Files for
null
and
tty
already exist from previous phases of the project, but we still need
/dev/zero
. We can refer to
devices.txt
in the Linux source code
Documentation
directory for major and minor numbers.
8.2.3. ps, sed & ed
These three packages can be found by using the Internet resources we have used before plus one new site. The
"sed" and "ed" packages can be found at the same place we found BASH, on the GNU FTP server. The procps
package shows up in an Ibiblio LSM search, but it is an old version. In order to find the latest version we can
go to the Freshmeat website at http://freshmeat.net and search for "procps" in projects.
Both "sed" and "ed" packages feature GNU's familiar configure script and are therefore very easy to build.
There is no configure script for "procps" but this does not make things too difficult. We can just read the
package's
README
file to find out about how to set various configuration options. We can use one of these
options to avoid the complexity of using and installing libproc. Setting
SHARED=0
makes
libproc
an
integrated part of ps rather than a separate, shared library.
8.3. Construction
8.3.1. Write a "more" script
Create the following script with a text editor and save it as
~/staging/bin/more.sh
#!/bin/sh
#
# more.sh − emulates the basic functions of the "more" binary without
# requiring ncurses or termcap libraries.
#
# Assume input is coming from STDIN unless a valid file is given as
# a command−line argument.
if [ −f $1 ]; then
INPUT="$1"
else
INPUT="/dev/stdin"
fi
#
# Set IFS to newline only. See BASH(1) manpage for details on IFS.
IFS=$'\n'
#
# If terminal dimensions are not already set as shell variables, take
# a guess of 80x25.
if [ "$COLUMNS" = "" ]; then
let COLUMNS=80;
fi
if [ "$LINES" = "" ]; then
let LINES=25;
Pocket Linux Guide
Chapter 8. Filling in the Gaps
43