web-dev-qa-db-fra.com

Exécuter des commandes Shell dans Elixir

Je veux exécuter un programme via mon code Elixir. Quelle est la méthode pour appeler une commande Shell sur une chaîne donnée? Y a-t-il quelque chose qui n'est pas spécifique à la plate-forme?

60
Lahiru

Voici comment exécuter une commande Shell simple sans arguments:

System.cmd("whoami", [])
# => {"lukas\n", 0}

Consultez la documentation sur System pour plus d'informations.

86
Overbryd

Vous pouvez jeter un œil dans le Erlang os Module . Par exemple. cmd(Command) -> string() devrait être ce que vous recherchez.

11
Jonas

La bibliothèque "devinus/sh" est une autre approche intéressante pour exécuter les commandes Shell.

https://github.com/devinus/sh

9
parroty

System.cmd/3 semble accepter les arguments de la commande sous forme de liste et n'est pas satisfait lorsque vous essayez de glisser des arguments dans le nom de la commande. Par exemple

System.cmd("ls", ["-al"]) #works, while
System.cmd("ls -al", []) #does not.

Ce qui se passe en fait en dessous, ce sont les appels System.cmd/3: os.find_executable/1 avec son premier argument, qui fonctionne très bien pour quelque chose comme ls mais renvoie false pour ls -al par exemple.

L'appel erlang attend une liste de caractères au lieu d'un binaire, vous avez donc besoin de quelque chose comme ceci:

"find /tmp -type f -size -200M |xargs rm -f" |> String.to_char_list |> :os.cmd
5
田咖啡

Je ne peux pas lier directement à la documentation pertinente mais c'est ici sous le module System

cmd(command) (function) # 
Specs:

cmd(char_list) :: char_list
cmd(binary) :: binary
Execute a system command.

Executes command in a command Shell of the target OS, captures the standard output of the command and returns the result as a binary.

If command is a char list, a char list is returned. Returns a binary otherwise.
5
Onorio Catenacci