This post is nice: the writer first explains a problem, using a simple example. In the next section, they reflect a bit about the problem, and then they casually mention two tools they built. In my opinion, this is amazing: you sponsor you project, while also making the problem it solves clear: use their tool to test how portable your code is
Pretty bad argument. If it’s not defined by POSIX, it’s not POSIX compatible if you rely on a specific behavior.<p>If you only use defined behavior and it works, it is compatible.<p>It’s like saying C99 isn’t a compiler. True, but you can still write C99 code, right?
> C99 isn’t a compiler.<p>Sure, but the pojt here is that if we say "Write in X" we generally understand it to mean "Treat X like a standard and don't get too colloquial with the stylings."<p>Pedantry is worthwhile, but it can be a diminishing returns game.
Feels like you missed the point.<p>On the example of 'echo \n' - it's not defined in POSIX, therefore a script written in "POSIX shell" must simply never hit that case.<p>TFA claims you can't target POSIX shell. That's silly, of course you can. The question is, what tools are there to check for compliance.
If your environment is POSIX, testing scripts with tool written in POSIX shell, like shellspec[1], might also be a choice.<p>[1] <a href="https://shellspec.info/" rel="nofollow">https://shellspec.info/</a>
Will not build without docker, so I am out of luck. This tells me this is not portable, even to some Linuxes.
Strict POSIX conformance is arguably worse. I mean, have you seen what it advises for shebangs? First of all:<p><pre><code> The shell reads its input from a file (see sh), from the -c option or from the system() and popen() functions defined in the System Interfaces volume of POSIX.1-2017. If the first line of a file of shell commands starts with the characters "#!", the results are unspecified.
</code></pre>
Ah, so shebangs are not required to be supported, already a great start.<p><pre><code> 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. [...]
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
</code></pre>
Marvelous. What a robust foundation of useful and hard-to-misuse utilities.