Path: utzoo!news-server.csri.toronto.edu!rutgers!usc!snorkelwacker.mit.edu!bloom-picayune.mit.edu!athena.mit.edu!jik From: jik@athena.mit.edu (Jonathan I. Kamens) Newsgroups: comp.unix.shell Subject: Re: csh exit(status) Message-ID: <1991Mar5.013129.22815@athena.mit.edu> Date: 5 Mar 91 01:31:29 GMT References: <11074@jarthur.Claremont.EDU> Sender: news@athena.mit.edu (News system) Distribution: usa Organization: Massachusetts Institute of Technology Lines: 62 In article <11074@jarthur.Claremont.EDU>, dfoster@jarthur.Claremont.EDU (Derek R. Foster) writes: |> % if { exit( 1 == 1 ) } echo "y" |> % if { exit( 1 == 0 ) } echo "y" |> y |> % if { exit( 1 != 1 ) } echo "y" |> y |> % if { exit( 0 == 0 ) } echo "y" The problem is that you are confusing exit statuses and with csh boolean expressions. When it comes to exit statuses, a 0 exit status is considered "true", and a non-zero exit status is considered "false". This is because a zero exit status indicates that a program executed successfully, which is what should be treated as "true", while a non-zero exit status usually indicates that a program was unsuccessful in some way. However, csh uses 1 to indicate true in boolean expressions, and 0 to indicate false. So, let's analyze what I've quoted above. The first one reads: if { exit( 1 == 1 ) } echo "y" The expression "1 == 1" is true. Since it is a boolean expression, that means it takes on the value 1. That means that the subshell exits with exit status 1. Now comes the reversal. You're checking that exit status using `{' and `}', rather than the the more common `(' and `)'. The only documentation about `{' and `}' in my csh man page says, "Also available in expressions as primitive operands are command executions enclosed in `{' and `}'..." What that doesn't tell you is that since what you're evaluating is the exit status of a command, rather than a boolean expression, the whole "{...}" expression is going to be true only if the command run inside inside it exits with a zero exit status. But in the case I mentioned, it *didn't*, it exited with a non-zero exit status, which means to the shell that it "failed," which means that the "{...}" expression is going to evaluate into a false boolean expression. You said that the point of all this is to do something like this: alias isxxxfile 'exit ( "\!*" =~ xxx* )' if { isxxxfile $somefile } dosomething; You can probably achieve that by just redefining the alias so that it uses "!~" instead of "=~"; in other words, reverse the boolean value of your check, so that the subshell exits with an *exit value* opposite the *boolean value* you are trying to test for. Observe: % alias isxxxfile 'exit ( "\!*" !~ xxx* )' % if { isxxxfile xxxfrep } echo "It is." It is. % if { isxxxfile yyyfrep } echo "It is." % if (! { isxxxfile yyyfrep } ) echo "It isn't." It isn't. -- Jonathan Kamens USnail: MIT Project Athena 11 Ashford Terrace jik@Athena.MIT.EDU Allston, MA 02134 Office: 617-253-8085 Home: 617-782-0710