9 votes

Comment exécuter des commandes linux à partir de R via bash sous le sous-système Windows pour Linux (WSL) ?

Le WSL sur Windows 10 permet l'exécution de commandes Linux et d'outils en ligne de commande via bash.exe. De manière très utile, un outil/commande Linux peut être appelé à partir de la ligne de commande Windows ( cmd.exe ) en le passant comme argument à bash.exe comme ceci :

bash.exe -c <linux command>

Ceci est très utile car cela devrait permettre aux scripts basés sur Windows de combiner les outils Windows et Linux de manière transparente.

Malheureusement, je n'ai pas réussi à appeler des commandes Linux à partir d'un script R (voir ci-dessous).

0) Système

Win10 x64 + Anniversary Update + WSL installé

1) Comparaison des cas où l'appel des commandes Linux fonctionne

Les éléments suivants fonctionnent tous pour moi ; montrés ici juste avec un exemple d'appel à ls .

  • à partir de la ligne de commande Windows (invite cmd.exe)

    bash -c "ls /mnt/a"
    
    bash -c "ls /mnt/a > /mnt/a/test.txt"
  • Cela fonctionne de la même manière si l'on commence à partir de WinKey + R

  • Le même travail se fait à partir d'un .bat fichier.

  • Il peut être appelé depuis un code compilé. J'ai essayé avec Delphi XE2 32-bit et 64-bit en utilisant ShellExecute :

    Par exemple, ceux-ci fonctionnent (32 et 64 bits) :

    ShellExecute (0, PChar('open'), PChar('cmd.exe'), PChar('/c c:\windows\system32\bash.exe -c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);

    Ou (code 32 bits) :

    ShellExecute (0, PChar('open'), PChar('c:\windows\sysnative\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);

    Ou (code 64 bits) :

    ShellExecute (0, PChar('open'), PChar('c:\windows\system32\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);

    Tout cela semble fonctionner (et ShellExecute retours 42).

2) Défaut d'appeler les commandes Linux à partir de R Utilisation de R 3.3.1 x64

Toutes les actions ci-dessous (et plusieurs autres similaires que j'ai essayées) échouent avec le statut 65535 :

shell('c:/windows/system32/bash.exe -c "ls /mnt/a"', shell="cmd.exe", flag = "/c")

shell("ls", shell="c:/windows/system32/bash.exe", flag = "-c")

system('cmd /c c:/windows/system32/bash.exe -c "ls /mnt/a > /mnt/a/test.txt"')

system('bash -c "ls /mnt/a"')

system('c:/windows/system32/bash.exe -c "ls /mnt/a > /mnt/a/test.txt"')

3) Question

Étant donné que les exemples sous 1) travail, je trouve 2) très déroutant. Est-ce que je rate quelque chose d'évident ?

Je serais très reconnaissant d'avoir un exemple simple où l'exécution d'une commande Linux par l'intermédiaire de bash.exe sous les travaux du WSL.

5voto

Rich Turner Points 4845

Vos exemples défaillants devraient maintenant fonctionner correctement dans Windows 10 Insider builds >= 14951 qui a introduit de nombreuses améliorations "interop" et de nouvelles capacités :

> system('bash -c "ls /"')

Génère :

bin   cache  dev  home  lib    media  opt   root  sbin  srv  tmp  var
boot  data   etc  init  lib64  mnt    proc  run   snap  sys  usr

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X