Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: "system" call uses a different shell, or does not pick
up the whole environment (Matthew)
2. Re: "system" call uses a different shell, or does not pick
up the whole environment (Hong Yang)
3. Re: "system" call uses a different shell, or does not pick
up the whole environment (Brent Yorgey)
4. Re: "system" call uses a different shell, or does not pick
up the whole environment (Brandon Allbery)
----------------------------------------------------------------------
Message: 1
Date: Tue, 28 Aug 2012 08:40:09 -0700
From: Matthew <[email protected]>
Subject: Re: [Haskell-beginners] "system" call uses a different shell,
or does not pick up the whole environment
To: Hong Yang <[email protected]>
Cc: [email protected]
Message-ID:
<cab4w-sau24kx5yrufsokeh9yntg1pizpojakjhd23-4eao1...@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
Not to further discourage you from experimenting, but xargs can also
run commands in parallel. Check out the -P argument. :)
On Tue, Aug 28, 2012 at 8:19 AM, Hong Yang <[email protected]> wrote:
> Hi Brent,
>
> Thanks for the xargs command info. I did not know it before.
>
> The other reason I want to play with my mapm version is eventually I want to
> make it concurrent.
>
> Thanks again,
>
> Hong
>
>
> On Tue, Aug 28, 2012 at 10:08 AM, Brent Yorgey <[email protected]>
> wrote:
>>
>> I do not know the solution to your problem -- dealing with shells,
>> environments, etc. can be tricky.
>>
>> However, do you know about the 'xargs' command? E.g. your example
>> could be accomplished with
>>
>> ls | xargs -L 1 -I{} cp -pr {} destination_dir/{}
>>
>> -Brent
>>
>> On Tue, Aug 28, 2012 at 09:58:16AM -0500, Hong Yang wrote:
>> > Hi,
>> >
>> > I am trying to mimic mapM() at shell command line. I define the
>> > interface
>> > as "mapm cmd2 cmd1," so cmd2 will be run for each of the cmd1 results.
>> > "$_"
>> > can be used inside cmd2 to represent the current cmd1 result.
>> >
>> > For example, the command
>> > mapm 'cp -pr $_ destination_dir/$_' ls
>> > copies everything under the current directory to the destination
>> > directory.
>> >
>> > The code is as follows:
>> >
>> > --
>> > module Main where
>> >
>> > import System.Environment ( getArgs )
>> > import System.Exit
>> > import System.IO
>> > import System.Process
>> > import Text.Regex
>> > import Text.Regex.Posix
>> >
>> > main = do
>> > hs_argv <- getArgs
>> > if length hs_argv /= 2
>> > then
>> > putStrLn "wrong arguments!" >> exitFailure
>> > else do
>> > let [cmd2, cmd1] = hs_argv
>> > (_, hOut, hErr, _) <- runInteractiveCommand cmd1
>> > err <- hGetContents hErr
>> > hClose hErr
>> > if null err
>> > then do
>> > out <- hGetContents hOut
>> > mapM (f cmd2) (lines out)
>> > else
>> > putStr err >> exitFailure
>> >
>> > f :: String -> String -> IO ExitCode
>> > f cmd2 item = system cmd2'
>> > where cmd2' = if cmd2 =~ "\\$\\_"::Bool
>> > then subRegex (mkRegex "\\$\\_") cmd2 item
>> > else cmd2
>> > --
>> >
>> > It works, except one issue that is bothering me.
>> >
>> > If I issue
>> > mapm 'lt $_' ls,
>> > I get a bunch of
>> > /bin/sh: lt: command not found,
>> > while I expect it act the same as
>> > mapm 'ls -Alrt --color=auto $_' ls,
>> > because "lt" is aliased to "ls -Alrt --color=auto."
>> >
>> > Notice "/bin/sh" above. My shell is actually tcsh. All the aliases are
>> > in
>> > ~/.cshrc.
>> >
>> > I tried replacing "system cmd2'" with
>> > system ("source ~/.cshrc; " ++ cmd2')
>> > and
>> > system ("tcsh -c " ++ "'source ~/.cshrc; " ++ cmd2' ++ "'"),
>> > but they did not solve the problem.
>> >
>> > Can someone please help me?
>> >
>> > Thanks,
>> >
>> > Hong
>>
>> > _______________________________________________
>> > Beginners mailing list
>> > [email protected]
>> > http://www.haskell.org/mailman/listinfo/beginners
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://www.haskell.org/mailman/listinfo/beginners
>
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
>
------------------------------
Message: 2
Date: Tue, 28 Aug 2012 10:49:20 -0500
From: Hong Yang <[email protected]>
Subject: Re: [Haskell-beginners] "system" call uses a different shell,
or does not pick up the whole environment
To: Matthew <[email protected]>
Cc: [email protected]
Message-ID:
<CA+_A4U7rDXfJ-715HzH3Lk=kvb4w8CW1ovu-F=sqvkmxkab...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Oh, yeah.
[-P max-procs]
On Tue, Aug 28, 2012 at 10:40 AM, Matthew <[email protected]> wrote:
> Not to further discourage you from experimenting, but xargs can also
> run commands in parallel. Check out the -P argument. :)
>
> On Tue, Aug 28, 2012 at 8:19 AM, Hong Yang <[email protected]> wrote:
> > Hi Brent,
> >
> > Thanks for the xargs command info. I did not know it before.
> >
> > The other reason I want to play with my mapm version is eventually I
> want to
> > make it concurrent.
> >
> > Thanks again,
> >
> > Hong
> >
> >
> > On Tue, Aug 28, 2012 at 10:08 AM, Brent Yorgey <[email protected]>
> > wrote:
> >>
> >> I do not know the solution to your problem -- dealing with shells,
> >> environments, etc. can be tricky.
> >>
> >> However, do you know about the 'xargs' command? E.g. your example
> >> could be accomplished with
> >>
> >> ls | xargs -L 1 -I{} cp -pr {} destination_dir/{}
> >>
> >> -Brent
> >>
> >> On Tue, Aug 28, 2012 at 09:58:16AM -0500, Hong Yang wrote:
> >> > Hi,
> >> >
> >> > I am trying to mimic mapM() at shell command line. I define the
> >> > interface
> >> > as "mapm cmd2 cmd1," so cmd2 will be run for each of the cmd1 results.
> >> > "$_"
> >> > can be used inside cmd2 to represent the current cmd1 result.
> >> >
> >> > For example, the command
> >> > mapm 'cp -pr $_ destination_dir/$_' ls
> >> > copies everything under the current directory to the destination
> >> > directory.
> >> >
> >> > The code is as follows:
> >> >
> >> > --
> >> > module Main where
> >> >
> >> > import System.Environment ( getArgs )
> >> > import System.Exit
> >> > import System.IO
> >> > import System.Process
> >> > import Text.Regex
> >> > import Text.Regex.Posix
> >> >
> >> > main = do
> >> > hs_argv <- getArgs
> >> > if length hs_argv /= 2
> >> > then
> >> > putStrLn "wrong arguments!" >> exitFailure
> >> > else do
> >> > let [cmd2, cmd1] = hs_argv
> >> > (_, hOut, hErr, _) <- runInteractiveCommand cmd1
> >> > err <- hGetContents hErr
> >> > hClose hErr
> >> > if null err
> >> > then do
> >> > out <- hGetContents hOut
> >> > mapM (f cmd2) (lines out)
> >> > else
> >> > putStr err >> exitFailure
> >> >
> >> > f :: String -> String -> IO ExitCode
> >> > f cmd2 item = system cmd2'
> >> > where cmd2' = if cmd2 =~ "\\$\\_"::Bool
> >> > then subRegex (mkRegex "\\$\\_") cmd2 item
> >> > else cmd2
> >> > --
> >> >
> >> > It works, except one issue that is bothering me.
> >> >
> >> > If I issue
> >> > mapm 'lt $_' ls,
> >> > I get a bunch of
> >> > /bin/sh: lt: command not found,
> >> > while I expect it act the same as
> >> > mapm 'ls -Alrt --color=auto $_' ls,
> >> > because "lt" is aliased to "ls -Alrt --color=auto."
> >> >
> >> > Notice "/bin/sh" above. My shell is actually tcsh. All the aliases are
> >> > in
> >> > ~/.cshrc.
> >> >
> >> > I tried replacing "system cmd2'" with
> >> > system ("source ~/.cshrc; " ++ cmd2')
> >> > and
> >> > system ("tcsh -c " ++ "'source ~/.cshrc; " ++ cmd2' ++ "'"),
> >> > but they did not solve the problem.
> >> >
> >> > Can someone please help me?
> >> >
> >> > Thanks,
> >> >
> >> > Hong
> >>
> >> > _______________________________________________
> >> > Beginners mailing list
> >> > [email protected]
> >> > http://www.haskell.org/mailman/listinfo/beginners
> >>
> >>
> >> _______________________________________________
> >> Beginners mailing list
> >> [email protected]
> >> http://www.haskell.org/mailman/listinfo/beginners
> >
> >
> >
> > _______________________________________________
> > Beginners mailing list
> > [email protected]
> > http://www.haskell.org/mailman/listinfo/beginners
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://www.haskell.org/pipermail/beginners/attachments/20120828/ebae4aa5/attachment-0001.htm>
------------------------------
Message: 3
Date: Tue, 28 Aug 2012 12:03:28 -0400
From: Brent Yorgey <[email protected]>
Subject: Re: [Haskell-beginners] "system" call uses a different shell,
or does not pick up the whole environment
To: Matthew <[email protected]>
Cc: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
Ooh, neat, I didn't even know about that option. =)
On Tue, Aug 28, 2012 at 08:40:09AM -0700, Matthew wrote:
> Not to further discourage you from experimenting, but xargs can also
> run commands in parallel. Check out the -P argument. :)
>
> On Tue, Aug 28, 2012 at 8:19 AM, Hong Yang <[email protected]> wrote:
> > Hi Brent,
> >
> > Thanks for the xargs command info. I did not know it before.
> >
> > The other reason I want to play with my mapm version is eventually I want to
> > make it concurrent.
> >
> > Thanks again,
> >
> > Hong
> >
> >
> > On Tue, Aug 28, 2012 at 10:08 AM, Brent Yorgey <[email protected]>
> > wrote:
> >>
> >> I do not know the solution to your problem -- dealing with shells,
> >> environments, etc. can be tricky.
> >>
> >> However, do you know about the 'xargs' command? E.g. your example
> >> could be accomplished with
> >>
> >> ls | xargs -L 1 -I{} cp -pr {} destination_dir/{}
> >>
> >> -Brent
> >>
> >> On Tue, Aug 28, 2012 at 09:58:16AM -0500, Hong Yang wrote:
> >> > Hi,
> >> >
> >> > I am trying to mimic mapM() at shell command line. I define the
> >> > interface
> >> > as "mapm cmd2 cmd1," so cmd2 will be run for each of the cmd1 results.
> >> > "$_"
> >> > can be used inside cmd2 to represent the current cmd1 result.
> >> >
> >> > For example, the command
> >> > mapm 'cp -pr $_ destination_dir/$_' ls
> >> > copies everything under the current directory to the destination
> >> > directory.
> >> >
> >> > The code is as follows:
> >> >
> >> > --
> >> > module Main where
> >> >
> >> > import System.Environment ( getArgs )
> >> > import System.Exit
> >> > import System.IO
> >> > import System.Process
> >> > import Text.Regex
> >> > import Text.Regex.Posix
> >> >
> >> > main = do
> >> > hs_argv <- getArgs
> >> > if length hs_argv /= 2
> >> > then
> >> > putStrLn "wrong arguments!" >> exitFailure
> >> > else do
> >> > let [cmd2, cmd1] = hs_argv
> >> > (_, hOut, hErr, _) <- runInteractiveCommand cmd1
> >> > err <- hGetContents hErr
> >> > hClose hErr
> >> > if null err
> >> > then do
> >> > out <- hGetContents hOut
> >> > mapM (f cmd2) (lines out)
> >> > else
> >> > putStr err >> exitFailure
> >> >
> >> > f :: String -> String -> IO ExitCode
> >> > f cmd2 item = system cmd2'
> >> > where cmd2' = if cmd2 =~ "\\$\\_"::Bool
> >> > then subRegex (mkRegex "\\$\\_") cmd2 item
> >> > else cmd2
> >> > --
> >> >
> >> > It works, except one issue that is bothering me.
> >> >
> >> > If I issue
> >> > mapm 'lt $_' ls,
> >> > I get a bunch of
> >> > /bin/sh: lt: command not found,
> >> > while I expect it act the same as
> >> > mapm 'ls -Alrt --color=auto $_' ls,
> >> > because "lt" is aliased to "ls -Alrt --color=auto."
> >> >
> >> > Notice "/bin/sh" above. My shell is actually tcsh. All the aliases are
> >> > in
> >> > ~/.cshrc.
> >> >
> >> > I tried replacing "system cmd2'" with
> >> > system ("source ~/.cshrc; " ++ cmd2')
> >> > and
> >> > system ("tcsh -c " ++ "'source ~/.cshrc; " ++ cmd2' ++ "'"),
> >> > but they did not solve the problem.
> >> >
> >> > Can someone please help me?
> >> >
> >> > Thanks,
> >> >
> >> > Hong
> >>
> >> > _______________________________________________
> >> > Beginners mailing list
> >> > [email protected]
> >> > http://www.haskell.org/mailman/listinfo/beginners
> >>
> >>
> >> _______________________________________________
> >> Beginners mailing list
> >> [email protected]
> >> http://www.haskell.org/mailman/listinfo/beginners
> >
> >
> >
> > _______________________________________________
> > Beginners mailing list
> > [email protected]
> > http://www.haskell.org/mailman/listinfo/beginners
> >
------------------------------
Message: 4
Date: Tue, 28 Aug 2012 13:12:08 -0400
From: Brandon Allbery <[email protected]>
Subject: Re: [Haskell-beginners] "system" call uses a different shell,
or does not pick up the whole environment
To: Hong Yang <[email protected]>
Cc: [email protected]
Message-ID:
<CAKFCL4XDOyCb9-dNvt5B6u+2LK+=rpgeq-fdi-un-slavo9...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
On Tue, Aug 28, 2012 at 10:58 AM, Hong Yang <[email protected]> wrote:
> I get a bunch of
> /bin/sh: lt: command not found,
> while I expect it act the same as
> mapm 'ls -Alrt --color=auto $_' ls,
> because "lt" is aliased to "ls -Alrt --color=auto."
>
> Notice "/bin/sh" above. My shell is actually tcsh. All the aliases are in
> ~/.cshrc.
>
"system"-like functions in most languages use /bin/sh specifically,
regardless of the user's shell, because programs cannot be expected to
adapt between the different redirection commands use by sh-like and
csh-like shells. Consistency is important here, if you run a shell command
from a program you do not want to deal with the fact that csh speaks an
incompatible language and fish uses XML, etc.
If you really want to run your/the user's shell, retrieve $SHELL from the
environment and run it directly.
system $ "${SHELL:-/bin/sh} -c '" ++ mycommand ++ "'"
--
brandon s allbery [email protected]
wandering unix systems administrator (available) (412) 475-9364 vm/sms
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://www.haskell.org/pipermail/beginners/attachments/20120828/65363946/attachment.htm>
------------------------------
_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners
End of Beginners Digest, Vol 50, Issue 34
*****************************************