On Mon, Jun 3, 2019 at 9:43 PM David Laight David.Laight@aculab.com wrote:
From: Masahiro Yamada
Sent: 03 June 2019 12:45 On Mon, Jun 3, 2019 at 8:16 PM David Laight David.Laight@aculab.com wrote:
From: Masahiro Yamada
Sent: 03 June 2019 11:49
To print the pathname that will be used by shell in the current environment, 'command -v' is a standardized way. [1]
'which' is also often used in scripting, but it is not portable.
All uses of 'which' should be expunged. It is a bourne shell script that is trying to emulate a csh builtin. It is doomed to fail in corner cases. ISTR it has serious problems with shell functions and aliases.
OK, I do not have time to check it treewide. I expect somebody will contribute to it.
BTW, I see yet another way to get the command path.
'type -path' is bash-specific.
'type' itself should be supported by all shells, but the output format (esp for errors) probably varies.
Maybe, we should do this too:
diff --git a/scripts/mkuboot.sh b/scripts/mkuboot.sh index 4b1fe09e9042..77829ee4268e 100755 --- a/scripts/mkuboot.sh +++ b/scripts/mkuboot.sh @@ -1,14 +1,14 @@ -#!/bin/bash +#!/bin/sh
/bin/sh might be 'dash' - which is just plain broken in so many ways. Try (IIRC) ${foo%${foo#bar}} It might even be the original SYSV /bin/sh which doesn't support $((expr)) or ${foo#bar} - but that may break too much, but $SHELL might fix it.
We cannot use any tool if you start to argue like "Hey, I know ancient implementation that did not work as expected".
Nobody can cover all corner-cases. That's why we have standard.
I think the reliable source is the Open Group Specification.
The behavior of /bin/sh is defined here: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag...
${parameter%[word]} and ${parameter#[word]} are defined, so we can use them in /bin/sh scripts.
dash probably has the rather obscure bug in stripping '\n' from $(...) output that I found and fixed in NetBSD's ash may years ago. Try: foo="$(jot -b "" 130)" All 130 '\n' should be deleted. Mostly it fails to delete all the '\n', but it can remove extra ones!
David
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)