2010-09-20 22:22, Kurt J. Bosch:
2010-09-20 17:56, Dave Reisner:
On Mon, Sep 20, 2010 at 05:39:25PM +0200, Kurt J. Bosch wrote:
2010-09-20 04:10, Dave Reisner:
On Mon, Sep 20, 2010 at 11:57:06AM +1000, Allan McRae wrote:
On 20/09/10 11:54, Dave Reisner wrote:
Use modprobe -a and a bash PE to filter the MODULES array.

Signed-off-by: Dave Reisner<d...@falconindy.com>
---
rc.sysinit | 12 ++++--------
1 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/rc.sysinit b/rc.sysinit
index 09d5e97..4b6e1e7 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -92,14 +92,10 @@ if /bin/pidof -o %PPID /sbin/udevd>/dev/null;
then
fi

# Load modules from the MODULES array defined in rc.conf
-if [[ $load_modules != off&& -f /proc/modules ]]; then
- stat_busy "Loading Modules"
- for mod in "${modul...@]}"; do
- if [[ $mod = ${mod#!} ]]; then
- /sbin/modprobe $mod
- fi
- done
- stat_done
+if [[ $load_modules != off&& -f /proc/modules ]]&& ((
${#modul...@]}> 0 )); then
+ stat_busy "Loading Modules"
+ /sbin/modprobe -a "${modul...@]/#\!*/}"
+ stat_done
fi

# Wait for udev uevents

Does this still work in the "null" case where there is only modules
specified with "!" in the front?

Allan


Excellent observation -- it would not. Counting the size of the array
with the PE in place isn't possible (or desirable), either. Perhaps a
more graceful solution is to reassign the output of the PE to a new
array and operate based on that. Certainly still beats calling modprobe
for every element in the array, imo.

d


I think it could be done like so:

From 6465c90fc851b12cfce791228415ae1c2823e050 Mon Sep 17 00:00:00 2001
From: Kurt J. Bosch<kjb-temp-2...@alpenjodel.de>
Date: Mon, 20 Sep 2010 17:31:54 +0200
Subject: [PATCH] rc.sysinit: only call modprobe once (as proposed by
Dave Reisner)

---
rc.sysinit | 9 +++------
1 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/rc.sysinit b/rc.sysinit
index 09d5e97..07b3f67 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -92,13 +92,10 @@ if /bin/pidof -o %PPID /sbin/udevd>/dev/null; then
fi

# Load modules from the MODULES array defined in rc.conf
-if [[ $load_modules != off&& -f /proc/modules ]]; then
+modules=$( echo ${MODULES[*]/\!*/} )
+if [[ $modules&& $load_modules != off&& -f /proc/modules ]]; then
stat_busy "Loading Modules"
- for mod in "${modul...@]}"; do
- if [[ $mod = ${mod#!} ]]; then
- /sbin/modprobe $mod
- fi
- done
+ /sbin/modprobe -a $modules
stat_done
fi

--
1.7.0.3


Your echo is redundant. Just quote the expansion and assign it.

NAK. Try this:
MODULES=( '!foo' '!bar' )
modules="${modul...@]/#\!*}"
[[ $modules ]] && echo "'$modules' is not a null string"
' ' is not a null string

modules="${modul...@]/#\!*}"

I think we're a looooong way away from the day when there's a '!' as
part of a module name, but I think it's probably best to anchor the
expression to the start of each element regardless.

OK, but the quotes aren't needed because word splitting is not performed
here. So we finally get:

modules=$( echo ${modul...@]/#\!*} )

--
Kurt

P.S. To clarify this a bit: Word splitting is not performed on variable assignment, but actually intended on parameter expansion to get rid of extra blanks by using echo.


Reply via email to