Category:C Shell: Difference between revisions

Content added Content deleted
(Copy text from C Shell. Wiki prevents move to 'Category:' namespace. Authors: Kernigh and Dkf. http://rosettacode.org/mw/index.php?title=C_Shell&action=history)
 
(Fill 'Syntax' and 'Reputation' sections.)
Line 1: Line 1:
{{language
{{language
|exec=interpreted}}{{implementation|UNIX Shell}}
|exec=interpreted
|tags=csh}}{{implementation|UNIX Shell}}
'''csh''' was the shell that William Joy wrote for [[BSD]]. '''csh''' accepted the same [[Unix]] commands as other shells, but had a very different syntax (for variable assignments, control flow, and such). '''csh''' is not compatible with the [[Bourne Shell]].
'''csh''' was the shell that William Joy wrote for [[BSD]]. '''csh''' accepted the same [[Unix]] commands as other shells, but had a very different syntax (for variable assignments, control flow, and such). '''csh''' is not compatible with the [[Bourne Shell]].


BSD keeps the C shell at <code>/bin/csh</code>, but few persons use it.
BSD keeps the C Shell at <code>/bin/csh</code>. [[Hashbang]] lines should use the -f option:

[[Hashbang]] lines for C shell scripts should use the -f option:


<lang csh>#!/bin/csh -f</lang>
<lang csh>#!/bin/csh -f</lang>

== Reputation ==
C Shell is obsolete. Most scriptwriters prefer a Bourne-compatible shell, and few users want to learn two flavors of shells. C Shell introduced tilde expansion (<code>ls ~</code>), history recall, job control and aliases, but POSIX shells now have all of those.

[http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ Csh Programming Considered Harmful] and [http://www.grymoire.com/Unix/CshTop10.txt Top Ten Reasons not to use the C shell] give multiple reasons to avoid C Shell.


== Syntax ==
== Syntax ==
[http://www.openbsd.org/cgi-bin/man.cgi?query=csh&apropos=0&sektion=1&manpath=OpenBSD+Current&arch=i386&format=html The manual for csh(1)] claims that C Shell has "a C-like syntax". Several other languages have a C-like syntax, including [[Java]] and [[Pike]], and Unix utilities [[AWK]] and [[bc]]. C Shell is less like [[C]] than those other languages.
{| class="wikitable" style="clear: right; width: 100%"

This example prints a [[Hailstone sequence]] from 13.

{| class="wikitable"
! C
! C
! C Shell
! C Shell
! Bourne Shell
|-
|-
|| <lang c>#include <stdio.h>
|| <lang c>#include <stdio.h>
Line 55: Line 62:


</lang>
</lang>
|}
|| <lang bash>




C Shell has no braces {} to group the commands. Strange keywords are <code>then</code>, <code>endif</code> and <code>end</code>. Expressions have <code>$n</code> instead of <code>n</code>. Assignments use <code>@ n</code>.


C Shell has "a C-like syntax" because C Shell is more like C than [[Bourne Shell]].


{| class="wikitable"

! Bourne Shell
n=13
! C Shell
|-
|| <lang bash>n=13
echo $n
echo $n
while test $n -ne 1; do
while test $n -ne 1; do
Line 71: Line 81:
fi
fi
echo $n
echo $n
done
done</lang>
|| <lang csh>@ n = 13

echo $n

while ($n != 1)
</lang>
if ($n % 2) then
@ n = 3 * $n + 1
else
@ n /= 2
endif
echo $n
end</lang>
|}
|}

Bourne Shell requires <code>test</code> or <code>expr</code> to evaluate expressions. C Shell has built-in expressions, so the Hailstone sequence comes more easily. These expressions have a stupid quirk: all operators are right-associative, so <code>10 - 3 - 2</code> acts like <code>10 - (3 - 2)</code>. The fix is to use parentheses.


<lang csh>% @ n = 10 - 3 - 2
<lang csh>% @ n = 10 - 3 - 2
% echo $n
% echo $n
9
9</lang>
% @ n = (10 - 3) - 2

<lang csh>% @ n = (10 - 3) - 2
% echo $n
% echo $n
5</lang>
5</lang>


== Links ==
== Links ==
* [http://www.openbsd.org/cgi-bin/man.cgi?query=csh&apropos=0&sektion=1&manpath=OpenBSD+Current&arch=i386&format=html csh(1) manual]
* [[OpenBSD]] has [http://www.openbsd.org/cgi-bin/man.cgi?query=csh&apropos=0&sektion=1&manpath=OpenBSD+Current&arch=i386&format=html csh(1) manual] and [http://www.openbsd.org/cgi-bin/cvsweb/src/bin/csh/ source code].
* [http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ Csh Programming Considered Harmful]
* [http://www.grymoire.com/Unix/CshTop10.txt Top Ten Reasons not to use the C shell]