Amul Shah on 24 Apr 2010 08:26:29 -0700 |
You could also setup alternatives that _should_ be held during upgrades. sudo update-alternatives --install /bin/sh sh /bin/bash 1 sudo update-alternatives --install /bin/sh sh /bin/dash 1 sudo update-alternatives --config sh which gives you: superuser@mansion:/etc/alternatives$ sudo update-alternatives -- install /bin/sh sh /bin/bash 1 update-alternatives: using /bin/bash to provide /bin/sh (sh) in auto mode. superuser@mansion:/etc/alternatives$ sudo update-alternatives -- install /bin/sh sh /bin/dash 1 superuser@mansion:/etc/alternatives$ ls -l /bin/sh lrwxrwxrwx 1 root root 20 2010-04-24 11:18 /bin/sh -> /etc/ alternatives/sh superuser@mansion:/etc/alternatives$ ls -l /etc/alternatives/sh lrwxrwxrwx 1 root root 9 2010-04-24 11:18 /etc/alternatives/sh -> /bin/ bash superuser@mansion:/etc/alternatives$ sudo update-alternatives --config sh There are 2 choices for the alternative sh (providing /bin/sh). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/bash 1 auto mode 1 /bin/bash 1 manual mode 2 /bin/dash 1 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /bin/dash to provide /bin/sh (sh) in manual mode. superuser@mansion:/etc/alternatives$ ls -l /bin/sh lrwxrwxrwx 1 root root 20 2010-04-24 11:18 /bin/sh -> /etc/ alternatives/sh superuser@mansion:/etc/alternatives$ ls -l /etc/alternatives/sh lrwxrwxrwx 1 root root 9 2010-04-24 11:18 /etc/alternatives/sh -> /bin/ dash HTH, Amul On Apr 24, 2010, at 1:15 AM, JP Vossen wrote: >> Date: Fri, 23 Apr 2010 14:35:30 -0400 >> From: Mike Leone <turgon@mike-leone.com> >> >> So I'm trying to run the bash script JP posted the other day, and >> it's >> failing, for reasons I can't quite figure out. >> >> $ bash -n snag-files.sh >> 'nag-files.sh: line 15: syntax error near unexpected token `{ >> 'nag-files.sh: line 15: `function _file_size { > [...] > > > Short answer: somehow you are getting dash, not bash. Unless /bin/ > bash > is somehow mangled into /bin/dash, I'm not sure how that could happen. > (You are using #!/bin/bash, as I had hard-coded and as is shown in the > test script, right?) > > They AREN'T the same, see: > http://princessleia.com/plug/2008-JP_bash_vs_dash.pdf > > > ### My Ubuntu 8.04 host looks like this: > [jp@host:T2:L1:C1127:J0:2010-04-24_00:54:06_EDT] > /tmp$ \ls -l /bin/*sh > -rwxr-xr-x 1 root root 813912 2008-05-12 14:36 /bin/bash > -rwxr-xr-x 1 root root 100856 2009-03-09 09:18 /bin/dash > lrwxrwxrwx 1 root root 4 2009-04-30 17:51 /bin/rbash -> bash > lrwxrwxrwx 1 root root 4 2009-04-30 17:51 /bin/sh -> dash > > [jp@host:T2:L1:C1129:J0:2010-04-24_00:55:46_EDT] > /tmp$ lsb_release -a > No LSB modules are available. > Distributor ID: Ubuntu > Description: Ubuntu 8.04.4 LTS > Release: 8.04 > Codename: hardy > > [jp@host:T2:L1:C1130:J0:2010-04-24_00:55:49_EDT] > /tmp$ md5sum /bin/*sh > e90d860c96c540807c251c8a49ae39bc /bin/bash > 4bc9bc6278af1af2bd5590dd96aa25da /bin/dash > e90d860c96c540807c251c8a49ae39bc /bin/rbash > 4bc9bc6278af1af2bd5590dd96aa25da /bin/sh > > Note the file sizes. That's a major reason why Ubuntu is using dash; > it's a lot smaller and therefor a lot faster to start and that adds up > when you are running a gazillion shell scripts, like when you are > booting... > > > > LONG answer: > AKA, the long and winding road I took to get to the above.... > > I hope I didn't cause more trouble than I'm worth with that script. > But > 'bash -n' runs clean for me, so I suspect one of three things. > > Very likely, someone's mail agent broke a line, and thus broke the > script. I hate sending attachments to mailing lists, so I've > forwarded > it as an attachment directly to Mike. > > If that isn't it, maybe your /bin/bash is somehow goofed up with > /bin/dash. dash supports functions but does not use the 'function' > keyword. OTOH, I like to use function (even though it's not > portable to > dash), because it's nice and greppable when I want a function list. > > Finally, if somehow it got DOS CRLF in the file (via mail agent, > Notepad, etc.) you can get *really* goofy error like that. > > >> ================= >> >> Seems to think that the function declaration is invalid. Looks >> right to >> me, from what I can tell. However, even the sample script using >> functions fails: (<http://tldp.org/HOWTO/Bash-Prog-Intro- >> HOWTO-8.html>) >> >> ================= >> $ more test.sh >> #!/bin/bash >> function quit { >> exit >> } >> function hello { >> echo Hello! >> } >> hello >> quit >> echo foo >> >> $ sh test.sh >> test.sh: 2: function: not found >> >> ============== >> >> So why are functions not being recognized on my system? Ubuntu >> 8.04. The >> shell for this user is explicitly set to "/bin/bash" in /etc/passwd. > > The /etc/passwd field is only the interactive setting, whatever the > script has in the shebang line (#!/bin/......) will take precedence to > run the script, else Perl and friends wouldn't work. > > > I was going to accuse you of creating that with Notepad and saving or > copying to Linux, but I get a slightly different error when I do that: > > ### Works for me: > [jp@ringo:T2:L1:C1078:J0:2010-04-24_00:45:12_EDT] > /tmp$ cat test.sh > #!/bin/bash > function quit { > exit > } > function hello { > echo Hello! > } > hello > quit > echo foo > > > [jp@ringo:T2:L1:C1078:J0:2010-04-24_00:46:03_EDT] > /tmp$ ./test.sh > Hello! > > ### Break it with CRLFs > [jp@ringo:T2:L1:C1079:J0:2010-04-24_00:46:06_EDT] > /tmp$ unix2dos test.sh > > [jp@ringo:T2:L1:C1080:J0:2010-04-24_00:47:26_EDT] > /tmp$ ./test.sh > bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or > directory > > > Hummmm... Not quite the same error. So maybe only some CRLFs? > Does a > 'dos2unix test.sh' help? (you probably have to do 'aptitude install > tofrodos' to get dos2unix) Else, as Brent already suggested: > > 1) run with bash -x > 2) Find out what /bin/bash really is: > \ls -l /bin/*sh > > The more I think about it, the more I think you've got dash somehow > mixed up in this... > > # Ubuntu 9.10 > [jp@ringo:T2:L1:C1084:J0:2010-04-24_00:53:55_EDT] > /tmp$ dos2unix test.sh > > # Hummmmmmmm! Bingo. > [jp@ringo:T2:L1:C1085:J0:2010-04-24_00:59:10_EDT] > /tmp$ dash test.sh > test.sh: 2: function: not found > > > Also, may I suggest that you not name scripts and functions with > reserved words like test, you will get nothing but trouble. (Yes, > that > is a recipe in the book. :) Technically, test.sh is OK, since it > isn't > quite 'test', but... Likewise, spell it out and *don't* assume that > /bin/sh is bash; it increasingly isn't. > > Good luck, > JP > > PS--I did see the other question about groups and perms. Been > swamped, > and am still thinking about that... > ----------------------------|:::======|------------------------------- > JP Vossen, CISSP |:::======| http://bashcookbook.com/ > My Account, My Opinions |=========| http://www.jpsdomain.org/ > ----------------------------|=========|------------------------------- > "Microsoft Tax" = the additional hardware & yearly fees for the add-on > software required to protect Windows from its own poorly designed and > implemented self, while the overhead incidentally flattens Moore's > Law. > ___________________________________________________________________________ > Philadelphia Linux Users Group -- http://www.phillylinux.org > Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce > General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug ___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug
|
|