Très souvent, le script que je veux exécuter ne se trouve pas dans mon répertoire de travail actuel et je ne veux pas vraiment le quitter.
Est-ce une bonne pratique d’exécuter des scripts (BASH, Perl, etc.) à partir d’un autre répertoire? Trouvent-ils généralement tout ce dont ils ont besoin pour fonctionner correctement?
Si tel est le cas, quel est le meilleur moyen de lancer un script "distant"? Est-ce
. /path/to/script
ou
sh /path/to/script
et comment utiliser sudo
dans de tels cas? Ceci, par exemple, ne fonctionne pas:
sudo . /path/to/script
. /path/to/script
sources du script! Vous n'avez pas du tout besoin de période si vous voulez simplement l'exécuter.Réponses:
sh / path / to / script va engendrer un nouveau shell et exécuter son script indépendamment de votre shell actuel. La
source
commande (.) Appellera toutes les commandes du script dans le shell actuel. Si le script appelleexit
par exemple, vous perdez le shell actuel. Pour cette raison, il est généralement plus sûr d'appeler des scripts dans un shell séparé avec sh ou de les exécuter en tant que fichiers binaires à l'aide du chemin complet (à partir de /) ou relatif (./). Appelés en tant que fichiers binaires, ils seront exécutés avec l'interpréteur spécifié (#! / Bin / bash, par exemple).Quant à savoir si un script trouvera ou non les fichiers dont il a besoin, il n’ya pas de bonne réponse à part regarder le script pour voir ce qu’il fait. En option, vous pouvez toujours accéder au dossier du script dans un sous-processus sans quitter votre dossier actuel:
la source
(cd /wherever/ ; sh script.sh)
? Pourquoi as-tu un$
devant?Vous pouvez certainement le faire (avec les ajustements que les autres ont mentionnés, comme
sudo sh /pathto/script.sh
ou./script.sh
). Cependant, je fais une des choses pour les exécuter sur tout le système pour ne pas m'inquiéter des répertoires et me épargner une saisie inutile.1) Lien symbolique vers
/usr/bin
(assurez-vous qu'il n'y a pas de noms qui se chevauchent, car vous auriez évidemment le remplacer.) Cela me permet également de les conserver dans mes dossiers de développement afin de pouvoir les ajuster si nécessaire.
2) Ajoutez le répertoire Scripts à votre chemin (en utilisant .bash_profile - ou le fichier que vous avez.profile sur votre shell)
PATH=/path/to/scripts/:$PATH
3) Créer des alias
.bash_profile
dans~/.bash_profile
ajouter quelque chose comme:Comme vous pouvez le constater, la syntaxe est simplement alias, les chiffres que vous souhaitez utiliser comme commande, la commande. Si vous tapez "l" n'importe où dans le terminal, vous obtiendrez
ls -l
Si vous voulez sudo,alias sl="sudo ls -l"
notez simplement l vs sl (exemple inutile).De toute façon, vous pouvez simplement taper
sudo nameofscript
et être sur votre chemin. Pas besoin de jouer avec ./ ou. ou sh, etc. Il suffit de les marquer comme exécutables en premier: Dla source
Je fais habituellement comme tu dis
Et pour l'exécuter en tant que root / superutilisateur
Votre répertoire actuel n’a d’importance que si les scripts supposent que vous êtes dans le même dossier. Je suppose que la plupart des scripts ne le font pas et que vous êtes sûr de l'exécuter comme ci-dessus.
la source
Je conserve généralement mes scripts dans
/usr/local/bin
ou/usr/local/sbin/
(si le script nécessite des privilèges root), conformément au standard FHS (Filesystem Hierarchy Standard), ils appartiennent.Tout ce que vous avez à faire est de vous assurer que ces deux répertoires sont ajoutés à votre
PATH
. Vous pouvez le faire en modifiant votre$HOME/.bashrc
fichier et en ajoutant cette ligne:Si vous voulez pouvoir exécuter un script en tant que root via
sudo
, vous devez ajouter ces répertoires à la variablesecure_path
dans votre fichier/etc/sudoers
.La modification de ce fichier se fait en exécutant,
visudo
ce qui évite les erreurs.la source
.bashrc
au lieu de.bachrc
.Je ne suis pas sûr que cela fonctionne comme cela sous Linux, en supposant que ce ne soit pas le cas si personne ne le suggère. Mais au lieu d'utiliser ././ pour revenir aux répertoires. Pouvez-vous utiliser des guillemets pour lui donner un chemin absolu? Peut-être que cela ne vous donne pas accès à l'intégralité du disque dur, même pour pouvoir le faire, à bien y penser.
la source
Si vous avez des scripts que vous devez exécuter souvent, et qu'ils dépendent de leur emplacement pour trouver des ressources, vous pouvez facilement le faire en combinant simplement des commandes dans un alias comme celui-ci.
De cette façon, vous n'avez rien à changer pour que cela fonctionne.
la source
Vous ne savez pas pourquoi personne n'a suggéré celui-ci, mais c'est super facile! J'ai googlé quelques fois et je ne trouvais pas la réponse exacte que je donnais, alors je pensais partager. OMI, ceci mais la meilleure solution, aussi la plus facile, pour moi de toute façon, mais d’autres peuvent se sentir et faire les choses différemment.
Tout d'abord, la commande 'cd' lui indique le répertoire de l'emplacement des scripts. Puis '&&' pour pouvoir le lier après avoir exécuté la commande suivante. Enfin, ouvrez votre script comme vous le feriez dans un terminal! Vous avez enregistré votre dans votre fichier BASH et l’installation prend 5 secondes.
J'espère que cela a aidé quelqu'un.
la source
Ancienne question, mais intemporelle.
La solution que j’ai toujours vue est d’avoir un
$HOME/bin
répertoire et de le placer en premier$PATH
(via~/.bashrc
si ce n’est pas déjà fait; sur certains systèmes, il~/bin
est premier$PATH
par défaut). Le fait d’y déposer des scripts pour l’exécution ou de créer des liens symboliques vers des scripts / exécutables est un moyen simple de traiter les problèmes de chemin qui ne devraient pas affecter le système ni les autres utilisateurs.Si un script nécessite des ressources supplémentaires pouvant être trouvées par rapport à son propre emplacement (pas inhabituel), la variable d'environnement
$BASH_SOURCE
est utilisée.$BASH_SOURCE
contient toujours le chemin absolu du script en cours d'exécution, quelle que soit la valeur de$PWD
.Considérer ce qui suit:
Nous pouvons donc voir que
$HOME/bin
c'est le premier arrivé$PATH
, donc tout ce que je mets~/bin
sera utilisé. J'ai un script de démonstration appelé~/bin/findme
:Ceci peut être utilisé pour obtenir le chemin absolu vers l'emplacement du script en cours d'exécution.
la source
bin
répertoire privé ? Cela semble lourd. (3) En outre, cela brise l'indépendance de la localisation. Si/home/desmond/bin/foo
est un lien vers mon script, alors leBASH_SOURCE
sera/home/desmond/bin/foo
, et le script ne pourra pas trouver ses ressources./bin
ou dans un emplacement connu/opt
. (3) L’indépendance d’emplacement est exactement ce que cela préserve lors de l’écriture d’une collection interdépendante de scripts personnels.