Well, sed is an improper example, I should have deleted "-i": (shell "sed \"s:guile/Guile/g" somefile")
On Sat, May 12, 2012 at 8:30 PM, Nala Ginrut <nalagin...@gmail.com> wrote: > hi folks! > Sometimes we need to run shell script and get the result as string type. > Say, in Ruby: > irb: `ls` > ==> > "ice-9\nlanguage\nMakefile.am\nMakefile.am~\nMakefile.in\noop\nrnrs\nrnrs.scm\nscripts\nsrfi\nstatprof.scm\nsxml\nsystem\ntexinfo\ntexinfo.scm\nweb\n" > > * Note: "system" lib function is useless for this, because "system" > can't return the result as string, but just the retval. > > This feature is very easy to implement in Guile, but I recommend to > add a global env-var %current-shell to point any shell-interpreter, > like csh/bash/sh/..., or modify it as user wish. > The "shell" implementation maybe like this: > -------------code---------------- > (define %current-shell (getenv "SHELL")) > (use-modules (ice-9 popen) (rnrs io ports)) > (define shell > (lambda (cmd) > (let ((str (string-append %current-shell " -c " cmd))) > (get-string-all (open-pipe str OPEN_READ))))) > -------------end---------------- > > and use it like regular shell: > (shell "sed -i \"s:guile/Guile/g" somefile") > > Moreover, we can implement "pwd" with this "shell" easily: > ----------code---------- > (use-module (ice-9 rdelim)) > (define (pwd) > (call-with-input-string (shell "pwd") > (lambda (port) (read-line port)))) > -----------end----------- > > (pwd) > ==> "/home/nalaginrut/Project/gnulib-20100109+stable" > > Any comment?