Lisp HUG Maillist Archive

strange behavior in sys:open-pipe

Hi again, list,

In LWL 5.0.1, sys:open-pipe doesn't build the exec'd command-line
correctly (or, at least, not how I would have expected it) when given
a simple string.

  (sys:open-pipe "foo bar baz")

should act like

  (sys:open-pipe (vector "/bin/ksh" "/bin/ksh" "-c" "foo bar baz"))

but sometimes it looks like it actually runs

  (sys:open-pipe (vector "/bin/ksh" "foo bar baz" "-c" "foo bar baz"))

The "sometimes" seems to involve using shell redirection.

Test case:

shell script: test-lw-pipe
> #!/bin/ksh
> 
> (
>   echo '$0:' $0
>   echo "args:" "$@"
>   ps auxww | grep -v grep | grep test-lw-pipe
>   echo
>   echo pid is $$
>   ps auxww | grep -v grep | grep $$
> ) > ~/lw-shell-args

BUG:

Listener:
> CL-USER 106 > (defparameter pipe (sys:open-pipe "test-lw-pipe a b c > /dev/null" :direction :io))
> PIPE

file ~/lw-shell-args:
> $0: /home/lmc/bin/test-lw-pipe
> args: a b c
> lmc      10122  0.0  0.1   2648  1240 pts/13   S+   11:07   0:00 test-lw-pipe a b c > /dev/null -c test-lw-pipe a b c > /dev/null
                                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ???
> lmc      10123  0.0  0.0   1740   536 pts/13   S+   11:07   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c
> lmc      10124  0.0  0.0   1740   336 pts/13   R+   11:07   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c
> 
> pid is 10123
> lmc      10123  0.0  0.0   1740   536 pts/13   S+   11:07   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c

Note specifically pid 10122.

Compare (EXPECTED RESULT):

Listener:
> CL-USER 107 > (defparameter pipe (sys:open-pipe "test-lw-pipe a b c" :direction :io))
> PIPE

File ~/lw-shell-args:
> $0: /home/lmc/bin/test-lw-pipe
> args: a b c
> lmc      10238  0.0  0.0   1736   532 pts/13   S+   11:12   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c
> lmc      10239  0.0  0.0   1736   332 pts/13   R+   11:12   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c
> 
> pid is 10238
> lmc      10238  0.0  0.0   1736   532 pts/13   S+   11:12   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c

And finally (REPRODUCED BEHAVIOR):

Listener:
> CL-USER 110 > (defparameter pipe (sys:open-pipe (vector "/bin/ksh" "test-lw-pipe a b c > /dev/null" "-c" "test-lw-pipe a b c > /dev/null") :direction :io))
                                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> PIPE

File ~/lw-shell-args:
> $0: /home/lmc/bin/test-lw-pipe
> args: a b c
> lmc      10311  0.0  0.0   1740   540 pts/13   S+   11:16   0:00 test-lw-pipe a b c > /dev/null -c test-lw-pipe a b c > /dev/null
                                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> lmc      10312  0.0  0.0   1740   536 pts/13   S+   11:16   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c
> lmc      10313  0.0  0.0   1740   336 pts/13   R+   11:16   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c
> 
> pid is 10312
> lmc      10312  0.0  0.0   1740   536 pts/13   S+   11:16   0:00 /bin/ksh /home/lmc/bin/test-lw-pipe a b c

I guess my workaround is to use the list form and not the string form.

I started this "bug report" because I thought the executable I was
actually calling was being called incorrectly, but doing further
research during the write-up made me realize that it only looks wrong
in ps.

Anyway, caveat user.

-- Larry Clapp


Updated at: 2020-12-10 08:46 UTC