On 11/28/09 03:53, quoth Michael Schwendt: > On Fri, 27 Nov 2009 23:20:23 -0500, Matthew wrote: > >> On Fri, Nov 27, 2009 at 10:55:17PM -0500, Steven W. Orr wrote: >>> I can't believe this is a real bug. I'm submit it to bugzilla. It's in F10, 11 >>> and 12. I'd be curious to know just how old this bug is. >>> Contents of mlocate.cron is: >>> #!/bin/sh >>> nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }') >> [...] >>> Unless I'm going cuckoo, I'm guessing that the intent was for line two to be: >>> nodevs=$(< /proc/filesystems | awk '$1 == "nodev" { print $2 }') >> Have you tried it? The code in the file isn't an error; it's just very >> obscure bash syntax. That is, $(< /some/file ) is obscure, and $(< >> /some/file filter-command ) is *really* obscure. Doesn't seem to be >> documented in the bash manual -- but it works. > > See first chapter of topic "REDIRECTION" in bash manual. > >> And putting a | in the middle there doesn't. > > That would only work as expected when also replacing "<" with "cat". > I am very interested in this question on multiple levels. Let's start at the first level: foo=$(< fn bar) apparently is functionally equivalent to foo=$( bar < fn ) which really is quite different from foo=$(cat fn | bar) which actually runs at least two child processes. I do *not* see anything in the bash man page, either in the description for $(< ) which says that it is functionally equivalent to using cat, but does not explain anything about pipes being illegal in this context. I also do not see anything of relevance to this topic in the bash man page on REDIRECTION. At best, the man page is deficient in that it *should* say that the syntax defaults to qq=$(0< filename) and that other values besides zero are supported. For example, qq=$(3< /etc/passwd 0<&3 cat) actually works. The other question which seems so obvious to me is the question of how mlocate.cron should be fixed. Yes, I agree that if I see that script hanging on a regular basis then I will provide trace data to Bugzilla for further analysis. But this begs two questions: 1. Should the scripts be written in sh or should we be allowed to use bash constructs, in this case, like BASH_REMATCH and =~. 2. Even though the solution is a bit longer, is that justification for doing it the way it's done instead of doing it correctly? My first proposal: *********start************* #!/bin/bash get_nodevs() { # Return ret as a global while read line # Read each line from /proc/filesystems do if [[ "$line" =~ $'^nodev\t(.*)$' ]] # Do a real regex then (( ${#BASH_REMATCH[@]} == 2 )) && ret="$ret ${BASH_REMATCH[1]}" fi done < /proc/filesystems ret=${ret:1} # Lop off the leading space. } ret='' # ret is global used to return value from get_nodevs get_nodevs nodevs="$ret" { renice +19 -p $$ ionice -c2 -n7 -p $$ | > /dev/null 2>&1 /usr/bin/updatedb -f "$nodevs" **********end************** could be correctly implemented in Bourne shell without using any bashisms by replacing get_nodevs with this: get_nodevs() { # Return ret as a global old_IFS="$IFS" IFS=' ' # There's a TAB in there while read line # Read each line from /proc/filesystems do set -- $line [[ $# -eq 2 && "$1" = nodev ]] && ret="$ret $2" done < /proc/filesystems IFS="$old_IFS" } Either way, the original script is deficient because it does not properly recognize fields 1 and 2. Am I being too anal? Is it a doc problem? Is it a bug in mlocate that should be fixed? -- Time flies like the wind. Fruit flies like a banana. Stranger things have .0. happened but none stranger than this. Does your driver's license say Organ ..0 Donor?Black holes are where God divided by zero. Listen to me! We are all- 000 individuals! What if this weren't a hypothetical question? steveo at syslang.net
Attachment:
signature.asc
Description: OpenPGP digital signature
-- fedora-list mailing list fedora-list@xxxxxxxxxx To unsubscribe: https://www.redhat.com/mailman/listinfo/fedora-list Guidelines: http://fedoraproject.org/wiki/Communicate/MailingListGuidelines