J'ai deux serveurs (Debian) Linux. Je crée un script shell.
Sur le premier je crée un tableau ainsi:
#!/bin/bash
target_array=(
"/home/user/direct/filename -p123 -r"
)
Cela fonctionne bien. Mais quand je lance ceci sur l'autre serveur, je reçois:
Syntax error: "(" unexpected
Autant que je sache, les deux serveurs sont les mêmes. Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas?
Si je le tape directement dans le terminal, tout va bien ??
Il semblerait que quand je le lance en tant que
sh scriptname.sh
J'obtiens l'erreur, mais si je l'exécute en tant que
./scriptname.sh
ça semble aller. Quelle est la différence?
bash
shell-script
array
IGGt
la source
la source
cat -v <script>
de voir s'il y a des parasites parasites.sh
n'est pasbash
et donc sish scriptname.sh
mal que ça marcheRéponses:
Lorsque vous l'utilisez,
./scriptname.sh
il s'exécute avec/bin/bash
comme dans la première ligne avec#!
. Mais quand vous l'utilisez,sh scriptname.sh
ça s'exécutesh
, pasbash
.Le
sh
shell n'a pas de syntaxe pour créer des tableaux, mais Bash a la syntaxe que vous avez utilisée.la source
./
de maintenant. à la#!/bin/sh
etsh script.sh
(ou#!/bin/bash
etbash script.sh
)a[index]=x
oua=(x y)
). Certains interprètes sh prennent en charge les tableaux, que ksh88 (non portés sous Linux AFAIK) et quelques variantes de pdksh âgées soutiendraienta[index]=value
et nona=(x y)
. Sur Debian,sh
c’est généralementdash
ce qui ne prend pas en charge le tableau (a[index]=x
cela ne fonctionnera pas).Courir
./scriptname.sh
se traduira par la lecture de la première ligne du fichier et veillera à ce qu’il soit nécessaire d’exécuter «/ bin / bash» et de transmettre le reste du script à l’interpréteur. Pendant l’exécutionsh scriptname.sh
, le fichier sera transmis au shell standard de l’utilisateur (par exemple, Ash). et soyez le cas que cet autre interpréteur ne supporte pas les tableaux comme Bash.la source
sh
n'est pas nécessairement le "shell standard de l'utilisateur" mais bien souvent son propre exécutable (ou lien symbolique) etsh
sera invoqué pour traiter le script. Cela sera vrai même si le shell de connexion par défaut pour cet utilisateur estbash
Avec
sh scriptname.sh
, vous l'exécutez avecsh
, pas nécessairement avecbash
. Essayez de comparersh --version
sur les deux machines. Et / ou avecdpkg -S $(which sh)
.la source
sh
un lien symbolique versbash
celui-ci se comportera différemment lorsqu'il sera appelésh