IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Scripts bash
Options
Anard
posté 10 Mar 2017, 13:32
Message #1


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 328
Inscrit : 7 May 2015
Membre no 195 224



Bonjour,

Je cherche à faire un tout petit executable pour copier un dossier dans un autre.
Fonctionne très bien sous Linux mais sous Mac, il semble ne pas supporter les chemins qui contiennent des espaces.
Pour faire simple, j'ai fait :
Code
#!/bin/bash
mkdir $HOME/Nouveau\ Dossier/

Puis renommé mon fichier en script.command

Mon $HOME contient un espace. Du coup quand je lances mon script, il s'arrête sur une erreur alors que Linux gère très bien ce problème.
Pourriez-vous m'aider ? Merci beaucoup.

Ce message a été modifié par Anard - 10 Mar 2017, 13:33.


--------------------
"iMack fin 2013" : GA-B85-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Clover - macOS Sierra / Ubuntu Artful Aardvark / Windows 10
Go to the top of the page
 
+Quote Post
teddy7545
posté 10 Mar 2017, 13:40
Message #2


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 737
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonjour

mkdir ne copie pas mais crée un nouveau répertoire .. mais j'ai compris apparemment que tu avais simplifié pour présenter le sujet

J'utilise très souvent des noms ou des textes avec des espaces dans mes commandes shell
Au lieu "d'escaper" les espaces il suffit en général d'utiliser les doubles guillemets (supportés par la plupart des commandes)

Essaye de faire ça :
Code
#!/bin/bash
mkdir "$HOME/Nouveau Dossier/"


Je suis néanmoins surpris que sous Linux tu puisse utiliser $HOME (comprenant un espace en direct) car l'espace sur tous les shell est considéré comme séparateur de commande.
Cela signifierait que sous Linux $HOME échapperait automatiquement les espaces (ce dont je doute).

A noter que tu peux mixer les deux méthodes si tu le souhaites en faisant par exemple :
Code
#!/bin/bash
mkdir "$HOME"/Nouveau\ Dossier/


Ce message a été modifié par teddy7545 - 10 Mar 2017, 13:56.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Anard
posté 10 Mar 2017, 13:53
Message #3


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 328
Inscrit : 7 May 2015
Membre no 195 224



Merci pour ta réponse.
Oui c'est pour simplifier le problème que je n'ai mis que le mkdir.
Super, en effet, en mettant le $HOME dans les guillemets, les espaces ne sont plus problématiques. Je ne pensais pas qu'il était possible de mettre tout le chemin entre guillemets...

Sinon, un autre petit souci : sous Linux, quand je lances mon script, il est executé dans le dossier courant (c'est à dire qu'un ls liste les fichiers du dossier dans lequel se trouve le script).
Sous Mac, le script semble s'executer dans le $HOME ce qui fait qu'un ls liste mes dossiers personnels.
Comment pourrais-je récupérer le chemin dans lequel est contenu mon script ?

Pour linux, voici mon script qui copie un dossier qui est à côté du script dans le dossier que je veux :
Code
#!/bin/bash
cp -r Dossier\ a\ copier/ $HOME/Destination/


--------------------
"iMack fin 2013" : GA-B85-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Clover - macOS Sierra / Ubuntu Artful Aardvark / Windows 10
Go to the top of the page
 
+Quote Post
Anard
posté 10 Mar 2017, 14:18
Message #4


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 328
Inscrit : 7 May 2015
Membre no 195 224



OK : voici le code pour Mac :
Code
#!/bin/bash

#current directory
cd "$( dirname "${0}" )"
cp -r Dossier\ a\ copier "$HOME/Dossier de destination/"


Merci wink.gif


--------------------
"iMack fin 2013" : GA-B85-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Clover - macOS Sierra / Ubuntu Artful Aardvark / Windows 10
Go to the top of the page
 
+Quote Post
teddy7545
posté 10 Mar 2017, 14:33
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 737
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Tout dépend en effet de la façon dont tu lance le script...

Si tu le lance depuis le terminal le répertoire courant est celui depuis lequel tu le lance... (pas nécessairement celui ou il est stocké)
Si tu clique depuis le finder sur un script c'est le *HOME qui est le répertoire courant.

Pour trouver ou se trouve le script tu peux utiliser la variable $0 avec dirname...
Ensuite tu peux utiliser la variable avec un cd pour changer ton répertoire courant ...

Exemple :

Code
#!/bin/bash

BASEDIR=$(dirname "$0")
echo "$BASEDIR"
echo "------      Liste des fichiers contenus dans le répertoire        ------"
echo "------ où se trouve le script sans déplacer le répertoire courant ------"
ls -l "$BASEDIR"
echo "------Répertoire courant avant------"
pwd
echo "------Répertoire courant après------"
cd "$BASEDIR"
pwd


EDIT: grillé tu as trouvé la réponse le temps que je rédige et test ma proposition de script wink.gif

Ce message a été modifié par teddy7545 - 10 Mar 2017, 14:53.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Anard
posté 10 Mar 2017, 16:11
Message #6


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 328
Inscrit : 7 May 2015
Membre no 195 224



Merci beaucoup. Autre question dans le même sujet :

Quelle est la différence entre $HOME et ~ ?
Si je fais cd "$HOME" ou cd ~ dans Terminal, en tout cas, je me retrouve au même endroit...


--------------------
"iMack fin 2013" : GA-B85-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Clover - macOS Sierra / Ubuntu Artful Aardvark / Windows 10
Go to the top of the page
 
+Quote Post
teddy7545
posté 10 Mar 2017, 19:00
Message #7


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 737
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



J'utilise très souvent ~ et je pense pas toujours à $HOME
Toutefois $HOME est plus universel et c'est une une variable d'environnement.
A priori ~ se comporte comme un alias de $HOME ... dans la plupart des shell mais pas par tous.

Normal donc qu'il donne la même chose sur ton shell standard sous OSX.

Chacune de ces deux formes ont toutefois des particularités.

Exemple 1:
~ n'est correctement interprété que s'il est le premier caractère alors que $HOME est bien développé même s'il est précédé d'un autre caractère.

Code
echo ~        --> fonctionne
echo "~"      --> ne fonctionne pas
echo $HOME    --> fonctionne
echo "$HOME"  --> fonctionne

ce qui posera un problème pour utiliser ~ dans un path contenant des espaces
quelques solutions toutefois possibles :
si pas d'espace dans ~ mais juste dans la suite tu peux utiliser la forme

Code
echo ~"/Nouveau dossier/"

sinon s'il ~ a des espaces, il sera nécessaire d'utiliser eval comme cela :

Code
echo $(eval echo "~")
ou encore
Code
echo $(eval echo "~/Nouveau dossier/"

Exemple 2:

Code
echo "/$HOME/Nouveau dossier/"
marchera en donnant
//Users/teddy2/Nouveau dossier/
qui sera bien interprété car dans le shell, le slash multiple est interprété comme un seul slash

Code
echo $(eval echo "/~/Nouveau dossier/")
ne marche pas (car le tilde ne sera plus développé) et donnera
/~/Nouveau dossier/

Ce message a été modifié par teddy7545 - 10 Mar 2017, 19:22.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Anard
posté 10 Mar 2017, 20:39
Message #8


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 328
Inscrit : 7 May 2015
Membre no 195 224



Wah. Merci pour cette super explication ! C'est tout de suite très clair. jap.gif
Petite précision, je crois que le tilde fonctionne aussi sous Linux.

Ce message a été modifié par Anard - 10 Mar 2017, 20:40.


--------------------
"iMack fin 2013" : GA-B85-D3H, Intel i5 4460, 8Go RAM, Intel HD4600, SSD 128+60Go / Clover - macOS Sierra / Ubuntu Artful Aardvark / Windows 10
Go to the top of the page
 
+Quote Post
yponomeute
posté 15 Mar 2017, 08:51
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 263
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



~ n'est absolument pas un alias de $HOME, ~ est un préfixe pour les commandes shell. Tous les caractères qui suivent un ~ jusqu'au premier / rencontré sont pris en compte pour l'utilisation de ce préfixe.

par exemple :

~toto va être interprété comme le $HOME de l'user toto, ~ utilisé seul (donc sans préciser le user) va renvoyé le $HOME de l'user courant

~titi/download correspond au répertoire download du $HOME de l'user titi

~+ renvoie $PWD et ~- renvoie $OLDPWD

et pour ceux qui naviguent dans l'arborescence des fichiers en utilisant la "pile des répertoires" on a ~n équivalent à dirs +n et ~-n équivalent à dirs -n

étant donné que ~ est un préfixe, il sera interprété comme un caractère quelconque dès lors qu'il ne se trouve pas en début de chaine de caractères

Ce message a été modifié par yponomeute - 15 Mar 2017, 08:57.


--------------------
Pourquoi "abréviation" est-il un mot si long ?
Pierre Légaré
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 20th February 2018 - 04:25