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.