On Mon, May 15, 2017 at 08:14:44AM -0700, Eliot Miranda wrote:
>
>
> On Mon, May 15, 2017 at 8:09 AM, Damien Pollet <[email protected]>
> wrote:
>
> My point was, if #shellCommand: accepts a single string for a whole
> command, then surely it passes it to a system shell already, so why nest a
> bash in between? (effectively running the equivalent of sh -c "bash -c
> \"ls
> ~\"')
>
>
> Clearly it doesn't do that otherwise Denis wouldn't have found that tile was
> unexpanded. I agree with you that it should. shellCommand: feels like a
> misnomer otherwise.
I'm not sure why Denis is having problems, but...
OSSUnixSubprocess>>shellCommand: aShellCommandString
"This is a simple facility method for the cases when the user wants to
use shell as the program.
This way, the user can directly send
shellCommand: 'ls -la | grep Pharo > /tmp/test.txt ' with the whole
string
rather than having to do set the command sh, send the '-c' argument,
etc etc etc.
We first try to use the SHELL defined in the OS by getting the env
variable $SHELL.
If not found, then we fallback to /bin/sh"
command := Smalltalk platform environment at: 'SHELL' ifAbsent:
['/bin/sh'].
arguments := Array with: '-c' with: aShellCommandString.
And if I execute the following in a playground:
| ls |
OSSUnixSubprocess new
shellCommand: 'ls ~';
redirectStdout;
runAndWaitOnExitDo: [ :process :outString |
ls := outString
].
ls.
It returns the expected value.
Cheers,
Alistair
> On 15 May 2017 at 16:28, Eliot Miranda <[email protected]> wrote:
>
> Hi Damien,
>
> On May 15, 2017, at 6:44 AM, Damien Pollet <[email protected]>
> wrote:
>
>
> On 15 May 2017 at 15:26, Eliot Miranda <[email protected]>
> wrote:
>
> Try something like
>
> shellCommand: 'bash -c ''ls ~''';
>
>
> But then that would run ls inside of bash inside of the system
> shell (/bin/sh), wouldn't it? What's the point?
>
>
> -c's argument is parsed by the shell so one gets full expansion.
> Further, if there are arguments after the string, they are assigned to
> the positional parameters, so that
>
> sh -c 'echo ~/$0' foo
>
> prints /Users/eliot/foo
>
> That may be useful.