🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.unix.shell
10 messages
10 total messages Started by Ranjan Bagchi Sun, 06 Jan 1991 05:07
weird csh thing
#2029
Author: Ranjan Bagchi
Date: Sun, 06 Jan 1991 05:07
27 lines
1127 bytes
anyone care to explain??  (I`m in csh)


$ set p = "w | tail +3 "
$ echo $p
w | tail +3
$ $p
Usage: w [ -hlsuw ] [ user ]
$ w | tail +3
benjo    ttyp3    10:13pm           41      4  -sh 
benjo    ttyp4    10:17pm         3:22      4  -csh 
$ exit
$ exit

Process shell finished


shouldn't "$p" have the same effect as "w | tail +3" ?

	-rj
--
--------------------------------------------------------------------------------
Ranjan Bagchi - At Large.  Well Kinda.  |  what kind of person
bagchi@[eecs                            |  would want to count syllables
        caen,                           |  just to write haiku?
	math.lsa].umich.edu     	|  
--------------------------------------------------------------------------------
Re: weird csh thing
#2035
Author: Eric M. Boehm
Date: Mon, 07 Jan 1991 14:27
59 lines
2501 bytes
bagchi@eecs.umich.edu (Ranjan Bagchi) writes:

>$ set p = "w | tail +3 "
>$ echo $p
>w | tail +3
>$ $p
>Usage: w [ -hlsuw ] [ user ]
>$ w | tail +3
>benjo    ttyp3    10:13pm           41      4  -sh
>benjo    ttyp4    10:17pm         3:22      4  -csh
>$ exit
>$ exit

>shouldn't "$p" have the same effect as "w | tail +3" ?

No, it should not. It has to do with the way the C Shell parses the
command line. The following is taken from "The UNIX C Shell Field
Guide, Gail Anderson, Paul Anderson, Prentice Hall, 1986, ISBN
0-13-937468-X", pages 262-266. (I highly recommend it).

1. History substitution - i.e.,interpret ! and ^.
2. Finding words - character strings delimited by blanks or tabs.
   Treat special characters &, |, ;, >, <, (, ), &&, ||, >>, << as words
   unless quoted.
3. Update the history list - after breaking command into words, put on
   history list.
4. Parse sequence of words in the following order:
   a. Quoting with ' and "
   b. Alias substitution
   c. I/O redirection, background execution, and pipes (recognized but
      not processed)
   d. Variable substitution
   e. Command substitution
   f. Filename expansion
5. Execute each command

Relevant to your example:
% set out = '>> ~/vault/words'
% cat dict1 >> ~/vault/words # try to replace with the following
% cat dict1 $out
[contents of dict1 appear here]
cat: cannot open >>

"What went wrong? We wanted the C shell to expand $out to specify
redirection. Unfortunately, since it has already handled redirection,
it simply passes >> to the cat command as a filename argument. Note
the importance of knowing precedence here."

"The C shell executes a subshell to process command substitution; that
is, the instance of the C shell that parses the command substitution
is distinct from the one that evaluates the text inside command
substitution marks."

In your case, since the shell has already handled redirection, it
passes | to w as an argument.
--
Eric M. Boehm
boehme@unvax.Union.EDU
BOEHME@UNION.BITNET
Re: weird csh thing
#2041
Author: Marc Unangst
Date: Mon, 07 Jan 1991 22:58
15 lines
863 bytes
bagchi@eecs.umich.edu (Ranjan Bagchi) writes:
> $ set p = "w | tail +3 "
[...]
> shouldn't "$p" have the same effect as "w | tail +3" ?

No.  The pipe character is not interpreted specially by the shell when
you run "$p"; therefore, you are calling the "w" command with the
arguments "|", "tail", and "+3".

Try "eval $p".

--
Marc Unangst               |
mju@mudos.ann-arbor.mi.us  | "Bus error: passengers dumped"
...!umich!leebai!mudos!mju | 
Re: weird csh thing
#2040
Author: Frank P. Bresz
Date: Tue, 08 Jan 1991 00:11
90 lines
3282 bytes
In article <BAGCHI.91Jan6000722@snarf.eecs.umich.edu> bagchi@eecs.umich.edu (Ranjan Bagchi) writes:

>anyone care to explain??  (I`m in csh)

>$ set p = "w | tail +3 "
>$ echo $p
>w | tail +3
>$ $p
>Usage: w [ -hlsuw ] [ user ]
>$ w | tail +3
>benjo    ttyp3    10:13pm           41      4  -sh
>benjo    ttyp4    10:17pm         3:22      4  -csh
>$ exit
>$ exit

>Process shell finished

>shouldn't "$p" have the same effect as "w | tail +3" ?

>	-rj

Well,
	I'll take a shot at an explanation.

	By saying:

		set p = "w | tail +3 "

	You have effectively escaped the normal behavior of | which is to
run a pipe to the next command in line.  Thereby passing the | to the 'w'
command as the first argument.  'w' does not understand what the '|'
symbol means so it spits out it's usage command.  This command shows what I
mean:

ittc% w \| tail +3
Usage: w [ -hlsuw ] [ user ]

	Had you instead said :

	eval $p

	You would have received the 'w' portion only the 'tail' would not
execute,  (at least it didn't under my csh SunOS4.1, why I don't know).
This scenario worked for both bash and sh.

$ p="w | tail +3"
$ $p
Usage: w [ -hlsuw ] [ user ]
$ eval $p
fpb      console  12:44pm  6:15   9:32   9:27  sv_xv_sel_svc
young    ttyh5    12:40pm  5:54                telnet wssi3
young    ttyha    11:29am  6:46      5      5  telnet wssi3
miller   ttyhc     2:33pm  3:33      3         -csh
fpb      ttyp0    12:44pm    28                /emacs/sun4/etc/bash
fpb      ttyp3     6:26pm            9      1  w
mance    ttyp9     3:10pm  3:49                -


	In CSH however I tried and received : 


ittc% set p = " w | tail +3 "
ittc% $p
Usage: w [ -hlsuw ] [ user ]
ittc% echo $p
w | tail +3
ittc% eval $p
  7:03pm  up 2 days, 12:04,  6 users,  load average: 1.60, 2.24, 2.05
User     tty       login@  idle   JCPU   PCPU  what
fpb      console  12:44pm  6:19   9:45   9:40  sv_xv_sel_svc
young    ttyh5    12:40pm  5:58                telnet wssi3
young    ttyha    11:29am  6:50      5      5  telnet wssi3
miller   ttyhc     2:33pm  3:37      3         -csh
fpb      ttyp0    12:44pm    32                /emacs/sun4/etc/bash
fpb      ttyp3     6:26pm           10      1  w
mance    ttyp9     3:10pm  3:54                -
ittc%

	Clearly the tail failed.  Any CSH wizards know why.  I received
bash about 4 months ago and haven't touched csh since.  Out of pure
inquisitiveness what is wrong with : 

	alias p "w | tail +3"
	p
--
| ()  ()  () | Frank P. Bresz   | Westinghouse Electric Corporation
|  \  /\  /  | fpb@ittc.wec.com | ITTC Simulators Department
|   \/  \/   | uunet!ittc!fpb   | Those who can, do. Those who can't, simulate.
| ---------- | +1 412 733 6749  | My opinions are mine, WEC don't want 'em.
Re: weird csh thing
#2332
Author: Brandon S. Allbery KB8JRR
Date: Tue, 08 Jan 1991 01:58
30 lines
1799 bytes
As quoted from <BAGCHI.91Jan6000722@snarf.eecs.umich.edu> by bagchi@eecs.umich.edu (Ranjan Bagchi):
+---------------
| anyone care to explain??  (I`m in csh)
| $ echo $p
| w | tail +3
| $ $p
| Usage: w [ -hlsuw ] [ user ]
| $ w | tail +3
| benjo    ttyp3    10:13pm           41      4  -sh 
| benjo    ttyp4    10:17pm         3:22      4  -csh 
+---------------

You'll find that sh does the same thing.

The reason is that variables are handled *after* the line is broken into
commands.  Since | is a command separator, it is parsed relatively early.
After sh or csh does command parsing, it expands variables... and since it's
too late to handle |, it's passed literally.  Similarly, < > is (I think)
parsed *but not necessarily executed* before variable substitution.  I also
seem to remember redirecting into the output of a command working under sh but
not under csh....

Shells are *weird* beasties.

++Brandon
-- 
Me: Brandon S. Allbery			    VHF/UHF: KB8JRR on 220, 2m, 440
Internet: allbery@NCoast.ORG		    Packet: KB8JRR @ WA8BXN
America OnLine: KB8JRR			    AMPR: KB8JRR.AmPR.ORG [44.70.4.88]
uunet!usenet.ins.cwru.edu!ncoast!allbery    Delphi: ALLBERY
Re: weird csh thing
#2316
Author: Neil Rickert
Date: Tue, 08 Jan 1991 03:17
24 lines
1288 bytes
In article <BAGCHI.91Jan6000722@snarf.eecs.umich.edu> bagchi@eecs.umich.edu (Ranjan Bagchi) writes:
>anyone care to explain??  (I`m in csh)
>
>$ set p = "w | tail +3 "
>
>shouldn't "$p" have the same effect as "w | tail +3" ?
>
 I suppose someone should point out that, taken literally, "$p" does
have the same effect as "w | tail +3 ".

% set p="w | tail +3 "
% "w | tail +3 "
w | tail +3 : Command not found.
% "$p"
w | tail +3 : Command not found.

 Of course this wasn't what you intended, but it also demonstrates that
quoting does effect the meaning of shell commands.

-- 
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  Neil W. Rickert, Computer Science               <rickert@cs.niu.edu>
  Northern Illinois Univ.
  DeKalb, IL 60115                                   +1-815-753-6940
Re: weird csh thing
#2308
Author: Christos S. Zoulas
Date: Tue, 08 Jan 1991 08:08
34 lines
1711 bytes
In article <1991Jan7.142732.28884@unvax.union.edu> boehme@unvax.union.edu (Eric M. Boehm) writes:
>bagchi@eecs.umich.edu (Ranjan Bagchi) writes:
>
>>$ set p = "w | tail +3 "
>>$ echo $p
>>w | tail +3
>>$ $p
>>Usage: w [ -hlsuw ] [ user ]
>>$ w | tail +3
>>benjo    ttyp3    10:13pm           41      4  -sh
>>benjo    ttyp4    10:17pm         3:22      4  -csh
>>$ exit
>>$ exit
>
>>shouldn't "$p" have the same effect as "w | tail +3" ?
>
>No, it should not. It has to do with the way the C Shell parses the
>command line. The following is taken from "The UNIX C Shell Field
>Guide, Gail Anderson, Paul Anderson, Prentice Hall, 1986, ISBN
>0-13-937468-X", pages 262-266. (I highly recommend it).
> ... lines deleted...

The above information is correct. On the other hand:

$ eval $p

should work, but it does not because eval in csh is broken.

christos
-- 
+------------------------------------------------------------------------+
| Christos Zoulas         | 389 Theory Center, Electrical Engineering,   |
| christos@ee.cornell.edu | Cornell University, Ithaca NY 14853.         |
| christos@crnlee.bitnet  | Phone: Disconnected  |   Fax: (607) 254 4565 |
Re: weird csh thing
#2321
Author: The Grey Wolf
Date: Wed, 09 Jan 1991 01:15
51 lines
1724 bytes
In article <BAGCHI.91Jan6000722@snarf.eecs.umich.edu> bagchi@eecs.umich.edu (Ranjan Bagchi) writes:
>anyone care to explain??  (I`m in csh)
>
>
>$ set p = "w | tail +3 "
>$ echo $p
>w | tail +3
>$ $p
>Usage: w [ -hlsuw ] [ user ]
>$ w | tail +3
>benjo    ttyp3    10:13pm           41      4  -sh 
>benjo    ttyp4    10:17pm         3:22      4  -csh 
>$ exit
>$ exit
>
>Process shell finished
>
>
>shouldn't "$p" have the same effect as "w | tail +3" ?
>
>	-rj

Try:

% eval $p

Reasoning:

In csh, while the arguments remain individual in the case of variable
substitution, it is as though each argument has been quoted; specifically,
it is though you have requested the following command line to be executed:

% "w" "|" "tail" "+3"

The pipe is never seen by the shell.  To understand this one, try the
following:

% set p = "echo | & < >"
% $p

The same result occurs when one tries:
% set p = ( echo | & < > )
% $p

eval seems to be the only way to work around this problem.

-- 
On the 'Net:  Why are more and more fourth-level wizard(-wannabe)s trying to
invoke ninth-level magic, instead of taking the time to climb the other
(quite essential) thirteen levels so they can do this properly?
...!{ucbvax,acad,uunet,amdahl,pyramid}!unisoft!greywolf
Re: weird csh thing
#2339
Author: Lance Speelmon -- UCS
Date: Thu, 10 Jan 1991 18:29
27 lines
1324 bytes
In article <BAGCHI.91Jan6000722@snarf.eecs.umich.edu> bagchi@eecs.umich.edu (Ranjan Bagchi) writes:
>anyone care to explain??  (I`m in csh)
>
Try:
set p = `w | tail +3`

i think that should fix it...

Lance

>
>$ set p = "w | tail +3 "
>$ echo $p
>w | tail +3
>$ $p
>Usage: w [ -hlsuw ] [ user ]
>$ w | tail +3
>benjo    ttyp3    10:13pm           41      4  -sh 
>benjo    ttyp4    10:17pm         3:22      4  -csh 
>$ exit
>$ exit
>
-- 
==============================================================================
| Lance Speelmon                      |  University Computing Services       | 
| speelmo@bronze.ucs.indiana.edu      |  Network Operations Center           |
==============================================================================
Re: weird csh thing
#2353
Author: Brandon S. Allbery KB8JRR
Date: Sat, 12 Jan 1991 03:53
18 lines
1412 bytes
As quoted from <1991Jan10.182958.21295@bronze.ucs.indiana.edu> by speelmo@bronze.ucs.indiana.edu (Lance Speelmon -- UCS):
+---------------
| In article <BAGCHI.91Jan6000722@snarf.eecs.umich.edu> bagchi@eecs.umich.edu (Ranjan Bagchi) writes:
| >anyone care to explain??  (I`m in csh)
| Try:
| set p = `w | tail +3`
| i think that should fix it...
+---------------

Ah, no.  This will set "p" to the output of "w | tail +3"... once and only
once.  Ranjan is trying to use a variable as an alias.

++Brandon
-- 
Me: Brandon S. Allbery			    VHF/UHF: KB8JRR on 220, 2m, 440
Internet: allbery@NCoast.ORG		    Packet: KB8JRR @ WA8BXN
America OnLine: KB8JRR			    AMPR: KB8JRR.AmPR.ORG [44.70.4.88]
uunet!usenet.ins.cwru.edu!ncoast!allbery    Delphi: ALLBERY
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads