Pouvez-vous donner quelques détails: quel système d'exploitation et quel (s) shell (s) ou parlez-vous simplement de ce problème en principe ?? Un exemple de code serait également utile.
jsalonen
14
Il ne s'agit pas vraiment d'une question spécifique ni d'un effort préalable pour résoudre le problème.
Kris
1
Un problème que je rencontrais était qu'il b.shn'avait pas d'autorisations exécutables. Ce pourrait être une bonne chose à vérifier.
seth10
Ajouter ./avant le nom du script, par exemple, à la place b.sh./b.sh
Rendez l'autre script exécutable, ajoutez la #!/bin/bashligne en haut et le chemin d'accès du fichier à la variable d'environnement $ PATH. Ensuite, vous pouvez l'appeler comme une commande normale;
Ou appelez-le avec la sourcecommande (alias is .) comme ceci source /path/to/script:;
Ou utilisez la bashcommande pour l' exécuter: /bin/bash /path/to/script;
Les première et troisième méthodes exécutent le script comme un autre processus, les variables et fonctions de l'autre script ne seront donc pas accessibles.
La deuxième méthode exécute le script dans le processus du premier script et extrait les variables et les fonctions de l'autre script afin qu'elles soient utilisables à partir du script appelant.
Dans la deuxième méthode, si vous utilisez exitdans le deuxième script, il quittera également le premier script. Ce qui ne se produira pas dans les première et troisième méthodes.
rappelez-vous chmod a+x /path/to/filesinon il ne sera pas exécutable. S'applique uniquement à la méthode ./script.
Nathan Lilienthal
3
N'oubliez pas de changer le format / l'encodage des fichiers exécutables sous Unix s'ils sont créés sous DOS puis téléchargés dans l'environnement Unix -> dos2unix <nom du script>
Abhishek Chatterjee
3
@cecemel La première et la troisième façon pourraient être "async" en utilisant la syntaxe normale en arrière-plan.
Un programmeur
16
Le problème sourceest qu'une exitinstruction dans le script appelé quittera également la vôtre ...
Ohad Schneider
18
@ user528025 .n'est pas un alias pour source, mais plutôt l'inverse. sourceest une extension bash, tout en .fonctionnant dans n'importe quel shell compatible POSIX.
Score_Under
207
Regarde ça.
#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
Cela suppose que script.sh se trouve dans le même répertoire que le script en cours d'exécution. Si vous vouliez appeler un script ailleurs, vous diriezsh <path to script>/script.sh
Morgan Kenyon
32
Cela utilise également deux coquilles bashet sh. Même quand shc'est en fait bashça ne se comporte pas de la même façon. Si vous utilisez, #!/bin/bashvous voulez probablement utiliser bash script.sh(ou simplement ./script.shutiliser le hashbang de ces scripts).
Martin Tournoij
1
Erreur d'obtention de l'autorisation refusée même lorsque j'ai défini le chmod +xfichier .sh. Aucune suggestion?
isaac weathers
@isaacweathers essayez chmod 777
Janac Meena
114
Il existe plusieurs façons de procéder. Terminal pour exécuter le script:
#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"# Here you execute your script"$SCRIPT_PATH"# or."$SCRIPT_PATH"# or
source "$SCRIPT_PATH"# or
bash "$SCRIPT_PATH"# oreval'"$SCRIPT_PATH"'# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT
# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT
# or("$SCRIPT_PATH")# or(exec "$SCRIPT_PATH")
Tout cela est correct pour le chemin avec des espaces !!!
Quelles sont leurs différences? Pourquoi un, pourquoi un autre?
rocketspacer
. "$ SCRIPT_PATH" est préféré
Harry Mumford-Turner
1
Je peux simplement ajouter que ceux-ci ne sont pas tous équivalents, par exemple sh "$ SCRIPT_PATH" et bash "$ SCRIPT_PATH" ne fonctionneront pas le script #! / Usr / bin / expect, alors que "$ SCRIPT_PATH" le fera.
Tahlor
58
La réponse que je cherchais:
( exec "path/to/script")
Comme mentionné, execremplace le shell sans créer de nouveau processus. toutefois , nous pouvons le mettre dans un sous-shell, ce qui se fait en utilisant les parenthèses.
EDIT: En fait, ( "path/to/script" )c'est suffisant.
Dépend de. En bref ... Si vous voulez charger des variables sur la console actuelle et les exécuter, vous pouvez les utiliser source myshellfile.shsur votre code. Exemple:
!#/bin/bash
set-x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable
set+x
Si vous voulez simplement exécuter un fichier et que la seule chose qui vous intéresse est le résultat, vous pouvez faire:
!#/bin/bash
set-x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set+x
Cela fonctionnera sûrement showdate.shsous / bin / sh plutôt que / bin / bash?
Chris Watts
j'ai essayé avec " /bin/sh ./showdate.sh", " /bin/bash ./showdate.sh", " ./showdate.sh" et exécuter le fichier: mainscript.sh et obtenu la même sortie.
Ranjithkumar T
10
Ajoutez simplement dans une ligne ce que vous auriez tapé dans un terminal pour exécuter le script!
par exemple:
#!bin/bash./myscript.sh &
si le script à exécuter ne se trouve pas dans le même répertoire, utilisez simplement le chemin complet du script.
par exemple: `/ home / user / script-directory /./ myscript.sh &
Si vous avez un autre fichier dans le même répertoire, vous pouvez soit:
bash another_script.sh
ou
source another_script.sh
ou
. another_script.sh
Lorsque vous utilisez bashau lieu de source, le script ne peut pas modifier l'environnement du script parent. La .commande est la norme POSIX tandis que la sourcecommande est un synonyme bash plus lisible pour .(je préfère sourceplus .). Si votre script réside ailleurs, indiquez simplement le chemin d'accès à ce script. Le chemin relatif et le chemin complet devraient fonctionner.
La première réponse suggère d'ajouter une #!/bin/bashligne à la première ligne du sous-script appelé. Mais même si vous ajoutez le shebang, il est beaucoup plus rapide * d'exécuter un script dans un sous-shell et de capturer la sortie:
$(source SCRIPT_NAME)
Cela fonctionne lorsque vous souhaitez continuer à exécuter le même interpréteur (par exemple de bash vers un autre script bash) et garantit que la ligne shebang du sous-script n'est pas exécutée.
Par exemple:
#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash"> $SUB_SCRIPT
echo 'echo $1'>> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if[[ $1 =="--source"]];thenfor X in $(seq 100);do
MODE=$(source $SUB_SCRIPT "source on")doneelsefor X in $(seq 100);do
MODE=$($SUB_SCRIPT "source off")donefi
echo $MODE
rm $SUB_SCRIPT
Production:
~❯❯❯ time ./test.sh
source off
./test.sh 0.15s user 0.16s system 87% cpu 0.360 total
~❯❯❯ time ./test.sh --source
source on
./test.sh --source 0.05s user 0.06s system 95% cpu 0.114 total
* Par exemple, lorsque des virus ou des outils de sécurité s'exécutent sur un appareil, cela peut prendre 100 ms supplémentaires pour exécuter un nouveau processus.
#!/bin/bash# Here you define the absolute path of your script
scriptPath="/home/user/pathScript/"# Name of your script
scriptName="myscript.sh"# Here you execute your script
$scriptPath/$scriptName
# Result of script execution
result=$?
C'était la seule chose dont j'avais besoin. Une fois que le script à exécuter est rendu exécutable comme ceci, vous (du moins dans mon cas) n'avez besoin d'aucune autre opération supplémentaire comme shou ./pendant que vous appelez le script.
Il y a quelques problèmes pour importer des fonctions à partir d'un autre fichier. Premièrement : vous n'avez pas besoin de faire ce fichier exécutable. Mieux vaut ne pas le faire! Ajoutez simplement
. file
pour importer toutes les fonctions. Et tous seront comme s'ils étaient définis dans votre fichier. Deuxièmement : vous pouvez définir la fonction avec le même nom. Il sera écrasé. C'est mauvais. Vous pouvez déclarer comme ça
declare -f new_function_name=old_function_name
et seulement après cela, importez. Vous pouvez donc appeler l'ancienne fonction par un nouveau nom. Troisièmement : vous ne pouvez importer que la liste complète des fonctions définies dans le fichier. Si certains ne sont pas nécessaires, vous pouvez les désactiver. Mais si vous réécrivez vos fonctions après leur désactivation, elles seront perdues. Mais si vous lui définissez une référence comme décrit ci-dessus, vous pouvez restaurer après unset avec le même nom. finalementDans la procédure courante d'importation, il est dangereux et pas si simple. Faites attention! Vous pouvez écrire un script pour le faire plus facilement et en toute sécurité. Si vous n'utilisez qu'une partie des fonctions (pas toutes), mieux vaut les diviser en différents fichiers. Malheureusement cette technique n'a pas bien fonctionné en bash. En python par exemple et dans d'autres langages de script, c'est simple et sûr. Possibilité de faire de l'importation partielle uniquement les fonctions nécessaires avec ses propres noms. Nous voulons tous que dans les prochaines versions de bush, la même fonctionnalité soit exécutée. Mais maintenant, nous devons écrire beaucoup de morue supplémentaire pour faire ce que vous voulez.
(Bienvenue à SO!) En tant qu'utilisateur Praveen a été vu pour la dernière fois en 2011, il est difficile de déterminer si la question était de savoir comment faire en sorte que le shell exécutant a.sh exécute b.sh (et continue à exécuter a.sh sinon commandé autrement ), ou littéralement b.sh appel . (Mon vérificateur d'orthographe n'attrape pas bush versions.) (Avez-vous quelqu'un vers qui vous tourner pour vous aider avec la grammaire anglaise? (J'aimerais parfois l'avoir.))
b.sh
n'avait pas d'autorisations exécutables. Ce pourrait être une bonne chose à vérifier../
avant le nom du script, par exemple, à la placeb.sh
./b.sh
No such file or directory
erreurs stackoverflow.com/a/2920431/1356559Réponses:
Il existe plusieurs façons de procéder:
Rendez l'autre script exécutable, ajoutez la
#!/bin/bash
ligne en haut et le chemin d'accès du fichier à la variable d'environnement $ PATH. Ensuite, vous pouvez l'appeler comme une commande normale;Ou appelez-le avec la
source
commande (alias is.
) comme cecisource /path/to/script
:;Ou utilisez la
bash
commande pour l' exécuter:/bin/bash /path/to/script
;Les première et troisième méthodes exécutent le script comme un autre processus, les variables et fonctions de l'autre script ne seront donc pas accessibles.
La deuxième méthode exécute le script dans le processus du premier script et extrait les variables et les fonctions de l'autre script afin qu'elles soient utilisables à partir du script appelant.
Dans la deuxième méthode, si vous utilisez
exit
dans le deuxième script, il quittera également le premier script. Ce qui ne se produira pas dans les première et troisième méthodes.la source
chmod a+x /path/to/file
sinon il ne sera pas exécutable. S'applique uniquement à la méthode ./script.source
est qu'uneexit
instruction dans le script appelé quittera également la vôtre ....
n'est pas un alias poursource
, mais plutôt l'inverse.source
est une extension bash, tout en.
fonctionnant dans n'importe quel shell compatible POSIX.Regarde ça.
la source
sh <path to script>/script.sh
bash
etsh
. Même quandsh
c'est en faitbash
ça ne se comporte pas de la même façon. Si vous utilisez,#!/bin/bash
vous voulez probablement utiliserbash script.sh
(ou simplement./script.sh
utiliser le hashbang de ces scripts).chmod +x
fichier .sh. Aucune suggestion?Il existe plusieurs façons de procéder. Terminal pour exécuter le script:
Tout cela est correct pour le chemin avec des espaces !!!
la source
La réponse que je cherchais:
Comme mentionné,
exec
remplace le shell sans créer de nouveau processus. toutefois , nous pouvons le mettre dans un sous-shell, ce qui se fait en utilisant les parenthèses.EDIT: En fait,
( "path/to/script" )
c'est suffisant.la source
/path/to/script
? Je ne vois pas du tout la nécessitéexec
ici?exec
.Dépend de. En bref ... Si vous voulez charger des variables sur la console actuelle et les exécuter, vous pouvez les utiliser
source myshellfile.sh
sur votre code. Exemple:Si vous voulez simplement exécuter un fichier et que la seule chose qui vous intéresse est le résultat, vous pouvez faire:
J'espère que cela vous aide. Merci.
la source
source
s'agit d'une fonctionnalité spécifique à bash. Le shell bourne standard a seulement.
(par exemple. other_script.sh
).Vous pouvez utiliser
/bin/sh
pour appeler ou exécuter un autre script (via votre script réel):La sortie serait:
la source
showdate.sh
sous / bin / sh plutôt que / bin / bash?/bin/sh ./showdate.sh
", "/bin/bash ./showdate.sh
", "./showdate.sh
" et exécuter le fichier: mainscript.sh et obtenu la même sortie.Ajoutez simplement dans une ligne ce que vous auriez tapé dans un terminal pour exécuter le script!
par exemple:
si le script à exécuter ne se trouve pas dans le même répertoire, utilisez simplement le chemin complet du script.
par exemple: `/ home / user / script-directory /./ myscript.sh &
la source
&
pour tâche de fondVous devez d'abord inclure le fichier que vous appelez:
alors vous appelez votre fonction comme ceci:
la source
Une source simple vous aidera. Pour Ex.
la source
Si vous avez un autre fichier dans le même répertoire, vous pouvez soit:
ou
ou
Lorsque vous utilisez
bash
au lieu desource
, le script ne peut pas modifier l'environnement du script parent. La.
commande est la norme POSIX tandis que lasource
commande est un synonyme bash plus lisible pour.
(je préfèresource
plus.
). Si votre script réside ailleurs, indiquez simplement le chemin d'accès à ce script. Le chemin relatif et le chemin complet devraient fonctionner.la source
La première réponse suggère d'ajouter une
#!/bin/bash
ligne à la première ligne du sous-script appelé. Mais même si vous ajoutez le shebang, il est beaucoup plus rapide * d'exécuter un script dans un sous-shell et de capturer la sortie:$(source SCRIPT_NAME)
Cela fonctionne lorsque vous souhaitez continuer à exécuter le même interpréteur (par exemple de bash vers un autre script bash) et garantit que la ligne shebang du sous-script n'est pas exécutée.
Par exemple:
Production:
* Par exemple, lorsque des virus ou des outils de sécurité s'exécutent sur un appareil, cela peut prendre 100 ms supplémentaires pour exécuter un nouveau processus.
la source
la source
la source
scriptPath
nom du dossier ou du fichierscriptName
avec des espacesSupposons que le nouveau fichier est "/ home / satya / app / app_specific_env" et que le contenu du fichier est le suivant
Ajoutez cette référence de fichier au fichier ~ / .bashrc
Chaque fois que vous redémarrez la machine ou vous reconnectez, essayez
echo $FAV_NUMBER
dans le terminal. Il affichera la valeur.Au cas où vous voudriez voir l'effet immédiatement,
source ~/.bashrc
dans la ligne de commande.la source
C'était la seule chose dont j'avais besoin. Une fois que le script à exécuter est rendu exécutable comme ceci, vous (du moins dans mon cas) n'avez besoin d'aucune autre opération supplémentaire comme
sh
ou./
pendant que vous appelez le script.Merci au commentaire de @Nathan Lilienthal
la source
Il y a quelques problèmes pour importer des fonctions à partir d'un autre fichier.
Premièrement : vous n'avez pas besoin de faire ce fichier exécutable. Mieux vaut ne pas le faire! Ajoutez simplement
pour importer toutes les fonctions. Et tous seront comme s'ils étaient définis dans votre fichier.
Deuxièmement : vous pouvez définir la fonction avec le même nom. Il sera écrasé. C'est mauvais. Vous pouvez déclarer comme ça
et seulement après cela, importez. Vous pouvez donc appeler l'ancienne fonction par un nouveau nom.
Troisièmement : vous ne pouvez importer que la liste complète des fonctions définies dans le fichier. Si certains ne sont pas nécessaires, vous pouvez les désactiver. Mais si vous réécrivez vos fonctions après leur désactivation, elles seront perdues. Mais si vous lui définissez une référence comme décrit ci-dessus, vous pouvez restaurer après unset avec le même nom.
finalementDans la procédure courante d'importation, il est dangereux et pas si simple. Faites attention! Vous pouvez écrire un script pour le faire plus facilement et en toute sécurité. Si vous n'utilisez qu'une partie des fonctions (pas toutes), mieux vaut les diviser en différents fichiers. Malheureusement cette technique n'a pas bien fonctionné en bash. En python par exemple et dans d'autres langages de script, c'est simple et sûr. Possibilité de faire de l'importation partielle uniquement les fonctions nécessaires avec ses propres noms. Nous voulons tous que dans les prochaines versions de bush, la même fonctionnalité soit exécutée. Mais maintenant, nous devons écrire beaucoup de morue supplémentaire pour faire ce que vous voulez.
la source
bush versions
.) (Avez-vous quelqu'un vers qui vous tourner pour vous aider avec la grammaire anglaise? (J'aimerais parfois l'avoir.))Utilisez des backticks.
Récupérez ensuite la sortie du script producteur comme argument sur le script consommateur.
la source