3 votes

Sourcez un script depuis une URL en bash

Je suppose que cela devrait fonctionner en bash :

source <(curl -s https://example.com/script.sh)

o

bash <(curl -s https://example.com/script.sh)

o

curl -s https://example.com/script.sh | source /dev/stdin

Mais ça ne marche pas pour moi. Télécharger vers un fichier, sourcer le fichier et ensuite supprimer le fichier fait travail. Je suis curieux de savoir pourquoi aucun des one liners ne fonctionne.

1 votes

Comment ça, ça ne marche pas ? Essayez-vous d'exécuter ceci dans un bash script ou ?

0 votes

Obtenez-vous un message d'erreur quelconque ?

0 votes

Je veux le mettre dans mon ~/.bashrc, j'ai essayé de l'exécuter à une invite bash aussi. Aucun message d'erreur. Seulement les alias qu'il contient ne sont pas disponibles, la complétion bash des noms d'hôtes SSH qu'il configure ne fonctionne pas, etc.

2voto

Ryan Spears Points 1524

Vous avez raison de dire que vos deux premières lettres de rappel devrait fonctionne selon bash sémantique de la substitution de processus . Sur mon tests ( bash 3.2 sur OS X 10.8.2), la seconde le fait, alors que la première ne le fait pas.

Dans le cas de votre première phrase, il semble que vous vous heurtiez à l'une des limites de la substitution de processus. En citant le Page Wikipedia sur la substitution de processus :

La substitution de processus présente certaines limites : les "fichiers" créés ne sont pas consultables, ce qui signifie que le processus qui lit ou écrit dans le fichier ne peut pas effectuer d'accès aléatoire ; il doit lire ou écrire une fois du début à la fin. Les programmes qui vérifient explicitement le type d'un fichier avant de l'ouvrir peuvent refuser de fonctionner avec la substitution de processus, car le "fichier" résultant de la substitution de processus n'est pas un fichier ordinaire.

- si source est une commande qui présente des difficultés à cet égard (du moins en bash 3.2), ce qui expliquerait son incapacité à fonctionner avec la substitution de processus.

La deuxième ligne semble échouer parce qu'elle exécute le code dans un sous-shell au lieu d'en faire la source. Si vous vous attendez à ce qu'il définisse des alias et des fonctions, cela ne fonctionnera pas, car ceux-ci ne sont pas reportés dans le shell parent lorsqu'ils sont définis dans un sous-shell.

La troisième ligne ne fonctionne pas parce que source ne traite pas stdin - uniquement des fichiers (voir page de manuel de bash ).

1 votes

Eh bien, cela fonctionne bien pour moi (au moins la deuxième), donc je soupçonne que quelque chose d'autre ne va pas pour le demandeur.

0 votes

@patrix Oui, c'est difficile à diagnostiquer sans savoir ce que le fichier source est censé faire. À en juger par les fils de commentaires, il est destiné à configurer des alias et des fonctions de complétion, qui ne seront pas transférés d'un sous-shell, bien sûr. J'ai modifié ma formulation pour refléter cela.

0 votes

Je doute que ce soit parce que la substitution de processus ne fonctionne pas, étant donné la réponse acceptée ici : superuser.com/questions/255260/bash-source-from-url

1voto

NaWi at Mac Points 181

Je ne sais pas ce que vous aimez faire mais si vous aimez télécharger un script (ou autre), utilisez.

curl -s -L https://example.com/script.sh -o script.sh

pour plus de détails, voir

man curl 

dans le terminal. -s silencieux, -L emplacement de la cible, y compris la redirection vers une nouvelle cible, -o fichier de sortie, si vous ne l'utilisez pas alors curl utilise le nom du fichier sur la cible (-o est souvent très utile).

Pour exécuter le script utilisez

./script.sh

0 votes

J'essaie de sourcer un script téléchargé dans mon environnement bash.

0 votes

Tant que vous ne répondrez pas à la question de savoir ce que vous avez fait et ce que vous aimez faire, personne ne pourra y répondre. L'avez-vous téléchargé ? Avez-vous obtenu une erreur de curl ? Si vous avez téléchargé le script comme décrit ci-dessus, rendez-le exécutable en utilisant chmode +x FILENAME et copiez-le quelque part dans votre PATH sudo mv FILENAME /usr/local/bin puis vous pouvez l'exécuter dans le terminal. Ou que voulez-vous dire ?

0 votes

@nawi-at-mac La beauté des <() La construction est que vous n'avez pas besoin de créer un fichier temporaire manuellement, donc je comprends pourquoi le demandeur veut l'utiliser. Mais sans informations supplémentaires sur l'erreur/la défaillance spécifique, il sera difficile de répondre à la question.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X