Scripts bash |
Bienvenue invité ( Connexion | Inscription )
Scripts bash |
10 Mar 2017, 13:32
Message
#1
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 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" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
10 Mar 2017, 13:40
Message
#2
|
|
Macbidouilleur de vermeil ! Groupe : Membres Messages : 879 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 |
|
|
10 Mar 2017, 13:53
Message
#3
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 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" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
10 Mar 2017, 14:18
Message
#4
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 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 -------------------- "iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
10 Mar 2017, 14:33
Message
#5
|
|
Macbidouilleur de vermeil ! Groupe : Membres Messages : 879 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 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 |
|
|
10 Mar 2017, 16:11
Message
#6
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 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" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
10 Mar 2017, 19:00
Message
#7
|
|
Macbidouilleur de vermeil ! Groupe : Membres Messages : 879 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 |
|
|
10 Mar 2017, 20:39
Message
#8
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 659 Inscrit : 7 May 2015 Membre no 195 224 |
Wah. Merci pour cette super explication ! C'est tout de suite très clair.
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" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3,
"Portable" : HP Pavilion DV3500, Intel core2 T6400, 4Go DDR3, NVidia GeForce 9300M, HDD 256Go / Grub2 - Gentoo-Xfce |
|
|
15 Mar 2017, 08:51
Message
#9
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 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. -------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
Nous sommes le : 23rd May 2024 - 17:52 |