9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
* [9fans] rc: $* != '/env/*'
@ 2017-10-18 15:31 Giacomo Tesio
  2017-10-18 16:01 ` Antons Suspans
  0 siblings, 1 reply; 6+ messages in thread
From: Giacomo Tesio @ 2017-10-18 15:31 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

I have been a bit surprised to see that $* does not always contains
the same as '/env/*':

% echo $*

% cat '/env/*'
% lc
bin/ lib/ tmp/
% echo $*

% cat '/env/*'
/bin/lc%

Not really an issue, but why this happens?


Giacomo



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [9fans] rc: $* != '/env/*'
  2017-10-18 15:31 [9fans] rc: $* != '/env/*' Giacomo Tesio
@ 2017-10-18 16:01 ` Antons Suspans
  2017-10-18 17:25   ` Skip Tavakkolian
  0 siblings, 1 reply; 6+ messages in thread
From: Antons Suspans @ 2017-10-18 16:01 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

On Wed, Oct 18, 2017 at 05:31:28PM +0200, Giacomo Tesio wrote:
> I have been a bit surprised to see that $* does not always contains
> the same as '/env/*':
>
> % echo $*
>
> % cat '/env/*'
> % lc
> bin/ lib/ tmp/
> % echo $*
>
> % cat '/env/*'
> /bin/lc%
>
> Not really an issue, but why this happens?

I guess...

When starting a command from rc, execforkexec() does fork(), which
is an equivalent of rfork(RFFDG|RFREND|RFPROC) and does not imply RFENVG.

As lc(1) is a shell script, its shell instance sets /env/'*'.

Hope this helps.

--
Antons



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [9fans] rc: $* != '/env/*'
  2017-10-18 16:01 ` Antons Suspans
@ 2017-10-18 17:25   ` Skip Tavakkolian
  2017-10-18 19:48     ` Giacomo Tesio
  0 siblings, 1 reply; 6+ messages in thread
From: Skip Tavakkolian @ 2017-10-18 17:25 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

[-- Attachment #1: Type: text/plain, Size: 1432 bytes --]

yes. lc -- an rc script -- shares the environment with the rc that starts
it; so env is updated with arglist of lc. $* is the arglist that parent
(interactive) rc was started with. rc(1) says:

        $*       Set to rc's argument list during initialization.
                   Whenever a . command or a function is executed, the
                   current value is saved and $* receives the new
                   argument list.  The saved value is restored on com-
                   pletion of the . or function.

if lc was a function, there would be no surprises:

% cat /bin/lc
#!/bin/rc
ls -p $* | mc
% fn LC { ls -p $* | mc }
% echo $*

% cat '/env/*'
% LC >/dev/null
% echo $*

% cat '/env/*'
%

On Wed, Oct 18, 2017 at 9:02 AM Antons Suspans <antox@ml.lv> wrote:

> On Wed, Oct 18, 2017 at 05:31:28PM +0200, Giacomo Tesio wrote:
> > I have been a bit surprised to see that $* does not always contains
> > the same as '/env/*':
> >
> > % echo $*
> >
> > % cat '/env/*'
> > % lc
> > bin/ lib/ tmp/
> > % echo $*
> >
> > % cat '/env/*'
> > /bin/lc%
> >
> > Not really an issue, but why this happens?
>
> I guess...
>
> When starting a command from rc, execforkexec() does fork(), which
> is an equivalent of rfork(RFFDG|RFREND|RFPROC) and does not imply RFENVG.
>
> As lc(1) is a shell script, its shell instance sets /env/'*'.
>
> Hope this helps.
>
> --
> Antons
>
>

[-- Attachment #2: Type: text/html, Size: 2193 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [9fans] rc: $* != '/env/*'
  2017-10-18 17:25   ` Skip Tavakkolian
@ 2017-10-18 19:48     ` Giacomo Tesio
  2017-10-19  4:48       ` Skip Tavakkolian
  0 siblings, 1 reply; 6+ messages in thread
From: Giacomo Tesio @ 2017-10-18 19:48 UTC (permalink / raw)


Pretty clear, thanks! :-)

So, to "fix" this rc would need an option to know to rfork(RFENVG)
before doing anything else.
Something like:

   -f [nNeEsfFm]   Start as a new process group using rfork(flags)

This way lc would produce not surprises by simply adding "-f e" to the
first line.

It shouldn't be an hard fix, but I wonder if it's actually worth the effort.


Also, probably -f is not the best flag here as it usually mean "file"...
-r would be a better choice, but it's taken for debugging output.
I might use -d for debugging output since -d is a no-op (why?) and -r
for this early rfork, but I have no idea of what it would broke.



Giacomo


2017-10-18 19:25 GMT+02:00 Skip Tavakkolian <skip.tavakkolian at gmail.com>:
> yes. lc -- an rc script -- shares the environment with the rc that starts
> it; so env is updated with arglist of lc. $* is the arglist that parent
> (interactive) rc was started with. rc(1) says:
>
>         $*       Set to rc's argument list during initialization.
>                    Whenever a . command or a function is executed, the
>                    current value is saved and $* receives the new
>                    argument list.  The saved value is restored on com-
>                    pletion of the . or function.
>
> if lc was a function, there would be no surprises:
>
> % cat /bin/lc
> #!/bin/rc
> ls -p $* | mc
> % fn LC { ls -p $* | mc }
> % echo $*
>
> % cat '/env/*'
> % LC >/dev/null
> % echo $*
>
> % cat '/env/*'
> %
>
> On Wed, Oct 18, 2017 at 9:02 AM Antons Suspans <antox at ml.lv> wrote:
>>
>> On Wed, Oct 18, 2017 at 05:31:28PM +0200, Giacomo Tesio wrote:
>> > I have been a bit surprised to see that $* does not always contains
>> > the same as '/env/*':
>> >
>> > % echo $*
>> >
>> > % cat '/env/*'
>> > % lc
>> > bin/ lib/ tmp/
>> > % echo $*
>> >
>> > % cat '/env/*'
>> > /bin/lc%
>> >
>> > Not really an issue, but why this happens?
>>
>> I guess...
>>
>> When starting a command from rc, execforkexec() does fork(), which
>> is an equivalent of rfork(RFFDG|RFREND|RFPROC) and does not imply RFENVG.
>>
>> As lc(1) is a shell script, its shell instance sets /env/'*'.
>>
>> Hope this helps.
>>
>> --
>> Antons
>>
>



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [9fans] rc: $* != '/env/*'
  2017-10-18 19:48     ` Giacomo Tesio
@ 2017-10-19  4:48       ` Skip Tavakkolian
  2017-10-19 13:52         ` Giacomo Tesio
  0 siblings, 1 reply; 6+ messages in thread
From: Skip Tavakkolian @ 2017-10-19  4:48 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

[-- Attachment #1: Type: text/plain, Size: 2700 bytes --]

i think 'rfork e' in lc will fix this; i'm not sure if it breaks anything
else.
i can't tell if this was an oversight or done on purpose. lc itself doesn't
seem all that useful or necessary.

On Wed, Oct 18, 2017 at 12:48 PM Giacomo Tesio <giacomo@tesio.it> wrote:

> Pretty clear, thanks! :-)
>
> So, to "fix" this rc would need an option to know to rfork(RFENVG)
> before doing anything else.
> Something like:
>
>    -f [nNeEsfFm]   Start as a new process group using rfork(flags)
>
> This way lc would produce not surprises by simply adding "-f e" to the
> first line.
>
> It shouldn't be an hard fix, but I wonder if it's actually worth the
> effort.
>
>
> Also, probably -f is not the best flag here as it usually mean "file"...
> -r would be a better choice, but it's taken for debugging output.
> I might use -d for debugging output since -d is a no-op (why?) and -r
> for this early rfork, but I have no idea of what it would broke.
>
>
>
> Giacomo
>
>
> 2017-10-18 19:25 GMT+02:00 Skip Tavakkolian <skip.tavakkolian@gmail.com>:
> > yes. lc -- an rc script -- shares the environment with the rc that starts
> > it; so env is updated with arglist of lc. $* is the arglist that parent
> > (interactive) rc was started with. rc(1) says:
> >
> >         $*       Set to rc's argument list during initialization.
> >                    Whenever a . command or a function is executed, the
> >                    current value is saved and $* receives the new
> >                    argument list.  The saved value is restored on com-
> >                    pletion of the . or function.
> >
> > if lc was a function, there would be no surprises:
> >
> > % cat /bin/lc
> > #!/bin/rc
> > ls -p $* | mc
> > % fn LC { ls -p $* | mc }
> > % echo $*
> >
> > % cat '/env/*'
> > % LC >/dev/null
> > % echo $*
> >
> > % cat '/env/*'
> > %
> >
> > On Wed, Oct 18, 2017 at 9:02 AM Antons Suspans <antox@ml.lv> wrote:
> >>
> >> On Wed, Oct 18, 2017 at 05:31:28PM +0200, Giacomo Tesio wrote:
> >> > I have been a bit surprised to see that $* does not always contains
> >> > the same as '/env/*':
> >> >
> >> > % echo $*
> >> >
> >> > % cat '/env/*'
> >> > % lc
> >> > bin/ lib/ tmp/
> >> > % echo $*
> >> >
> >> > % cat '/env/*'
> >> > /bin/lc%
> >> >
> >> > Not really an issue, but why this happens?
> >>
> >> I guess...
> >>
> >> When starting a command from rc, execforkexec() does fork(), which
> >> is an equivalent of rfork(RFFDG|RFREND|RFPROC) and does not imply
> RFENVG.
> >>
> >> As lc(1) is a shell script, its shell instance sets /env/'*'.
> >>
> >> Hope this helps.
> >>
> >> --
> >> Antons
> >>
> >
>
>

[-- Attachment #2: Type: text/html, Size: 3701 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [9fans] rc: $* != '/env/*'
  2017-10-19  4:48       ` Skip Tavakkolian
@ 2017-10-19 13:52         ` Giacomo Tesio
  0 siblings, 0 replies; 6+ messages in thread
From: Giacomo Tesio @ 2017-10-19 13:52 UTC (permalink / raw)


2017-10-19 6:48 GMT+02:00 Skip Tavakkolian <skip.tavakkolian at gmail.com>:
> i think 'rfork e' in lc will fix this; i'm not sure if it breaks anything
> else.

Actually 'rfork e' in lc fixes this.
I did not even tried because I assumed that /env/* was written at rc
startup, before reading the input script.
I was wrong, actually, but now I wonder when it's written... probably
just before the first exec.

> i can't tell if this was an oversight or done on purpose. lc itself doesn't
> seem all that useful or necessary.

As for lc, I use it pretty often :-)

But actually I asked about the "dirty" /env/* because I thought it
could have had a purpose I was missing.


Giacomo



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-10-19 13:52 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-18 15:31 [9fans] rc: $* != '/env/*' Giacomo Tesio
2017-10-18 16:01 ` Antons Suspans
2017-10-18 17:25   ` Skip Tavakkolian
2017-10-18 19:48     ` Giacomo Tesio
2017-10-19  4:48       ` Skip Tavakkolian
2017-10-19 13:52         ` Giacomo Tesio

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).