Standard input and standard error are the files that determine
whether a shell is interactive when -i
is not specified. For
example:
sh > file
and:
sh 2> file
create interactive and non-interactive shells, respectively.
Although both accept terminal input, the results of error
conditions are different, as described in Section 2.8.1,
Consequences of Shell Errors; in the second example a redirection
error encountered by a special built-in utility aborts the shell.
A conforming application must protect its first operand, if it
starts with a <plus-sign>, by preceding it with the "--"
argument
that denotes the end of the options.
Applications should note that the standard PATH to the shell
cannot be assumed to be either /bin/sh
or /usr/bin/sh
, and should
be determined by interrogation of the PATH returned by getconf
PATH, ensuring that the returned pathname is an absolute pathname
and not a shell built-in.
For example, to determine the location of the standard sh
utility:
command -v sh
On some implementations this might return:
/usr/xpg4/bin/sh
Furthermore, on systems that support executable scripts (the "#!"
construct), it is recommended that applications using executable
scripts install them using getconf PATH to determine the shell
pathname and update the "#!"
script appropriately as it is being
installed (for example, with sed). For example:
#
# Installation time script to install correct POSIX shell pathname
#
# Get list of paths to check
#
Sifs=$IFS
Sifs_set=${IFS+y}
IFS=:
set -- $(getconf PATH)
if [ "$Sifs_set" = y ]
then
IFS=$Sifs
else
unset IFS
fi
#
# Check each path for 'sh'
#
for i
do
if [ -x "${i}"/sh ]
then
Pshell=${i}/sh
fi
done
#
# This is the list of scripts to update. They should be of the
# form '${name}.source' and will be transformed to '${name}'.
# Each script should begin:
#
# #!INSTALLSHELLPATH
#
scripts="a b c"
#
# Transform each script
#
for i in ${scripts}
do
sed -e "s|INSTALLSHELLPATH|${Pshell}|" < ${i}.source > ${i}
done