Hello
I am trying to run an external command "rsync * a: " with run() and the * makes it impossible. there is an old unresolved question on this. How to quote special characters in run() function
I am now making a detour to R to make it happen
R"
system(“rsync * a:”)
"
but that seems very inelegant.
Is there a way to do this natively in Julia?
best regards, Jack
             
            
              
              
              
            
                
            
           
          
            
            
              You can use the Glob.jl package:
run(`rsync $(glob("*")) a:`)
             
            
              
              
              3 Likes
            
            
           
          
            
            
              Thanks fredrikekre!
That worked brilliantly! And I would never have thought of that usage of glob.
best, Jack
             
            
              
              
              
            
            
           
          
            
            
              
The problem is not quoting or “special characters”.  You can do run(`rsync "*" a:"`) which passes the * to rsync just fine.   However, it looks like you don’t actually want to pass * to rsync — you want * expansion (globbing), but this is performed by the shell and Julia’s run does not invoke the shell — it runs rsync directly.
If you want to run rsync via a shell, you can do so by directly invoking sh -c, i.e.:
run(`sh -c "rsync * a:"`)
(Invoking a shell is what R’s system function is doing.)
However, invoking the shell is a suboptimal approach in general.   Not only is it slower (first the system launches a sh process, then sh launches rsync), but it also runs into lots of brittle issues with quoting.  (And there are portability problems, e.g. on Windows.)
That’s why we generally recommend pure-Julia alternatives to shell features, like the Glob.jl package if you want to do glob expansion of paths, or Julia’s pipeline function if you want to pipe.
             
            
              
              
              8 Likes
            
            
           
          
            
            
              Thanks stevengj
That makes perfect sense to me. I am indeed globbing and it works as it should with Glob.jl.
all the best, Jack
             
            
              
              
              1 Like