On May 18, 2013, at 4:54 PM, Quartz wrote:
>
>> #foo works with sh
>
> Is it actually part of the official spec though is what I'm wondering, or is
> it a case of other shells not rejecting 'advanced' statements when running in
> emulation.
>
Shells don't have an "emulation mode". The shell supports what it supports, and
no shell that I've ever used had an "emulation mode" to act like another shell.
Maybe you're referring to as "emulation" is actually the invocation line of the
shell script.
Make no mistake… when you change the invocation (first) line of a shell script
from:
#/bin/sh
to:
#/bin/tcsh
You are not instructing a shell to "emulate" anything, you are actually using a
different shell.
sh != tcsh != bash != ash != dash != zsh
Your script will use the shell that is written in the innovation line and the
features you get are respective to which shell you choose.
>
>> At least FreeBSD's implementation of sh (which is ash, I think)
>> supports the # functionality.
>
> The reason I say all this is that my copy of tcsh (on this not-freebsd
> machine) *doesn't* work with this when in sh emulation.
>
Get the idea that "csh" or "tcsh" are *anything* like sh out of your mind.
Further, you almost *never* want to do any serious shell programming in csh or
tcsh.
Why? Because csh and tcsh have an incomplete programming spec. Most notably are
the way that it handles pipe data and the standard-output/error file
descriptors. Specifically, you cannot throw away stdout while keeping stderr.
This short-coming may not be noticeable to all programmers that choose
csh/tcsh, but if you want to do any serious programming, you'll eventually hit
those limitations and be forced to move to a real shell (real in the sense that
it has a complete programming specification).
I personally never recommend csh/tcsh as a scripting language… but I can see
the benefit that certain constructs (like "repeat N cmd") have, purely for
their simplicity (and readability for *very* short scripts). To challenge
myself on this topic, I routinely try and cross-port very complex shell scripts
to csh, and while I can do math with "let" and I can other things that a
*normal* scripting language should allow… I invariably end up running away
screaming in frustration.
Again,
csh != tcsh != sh != bash != ash != dash != zsh
--
Devin
_____________
The information contained in this message is proprietary and/or confidential.
If you are not the intended recipient, please: (i) delete the message and all
copies; (ii) do not disclose, distribute or use the message in any manner; and
(iii) notify the sender immediately. In addition, please be aware that any
message addressed to our domain is subject to archiving and review by persons
other than the intended recipient. Thank you.
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[email protected]"