Essayer de créer un script bash (sur mac) qui crée un dossier, puis exécute une série de scripts dans ce dossier. Je souhaite rappeler le chemin d'accès absolu au dossier et demander à l'utilisateur de confirmer avant de prendre des mesures.
Le script prend comme argument un chemin relatif, comment puis-je convertir un chemin absolu avant de créer le dossier?
!/bin/bash
if [[ $# -eq 0 ]] ; then
echo 'Whoa! You dont want to do that! you need to tell me where to put it'
exit 0
fi
ORG_DIR=$(pwd)
#here I want to get path before making directory, I've only figured out how to do after.
mkdir ../$1
cd ../$1
NEW_DIR=$(pwd)
echo "Running scripts in"
echo $NEW_DIR
read -p "Are you sure? (y/n) " -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
# run a bunch of scripts
fi
Comment puis-je obtenir le chemin absolu de NEW_DIR avant de le créer?
Remarque: la plate-forme est OSX, je n'ai pas besoin de prendre en charge d'autres variantes de nix.
EDIT: Sam 29
Je me suis rendu compte que, dans un effort pour réduire la question aux détails essentiels, je réduisais trop mes excuses.
Ce script existe dans (par exemple saké)
/Documents/git/ProjectGenerator
J'ai l'intention que le script génère un projet (ou le chemin entré)
/Documents/git/NewProject
Il exécute une combinaison de scripts npm et copie des fichiers à partir de
/Documents/git/ProjectGenerator
Le reste du script fonctionne bien maintenant, mais j'ai récemment accidentellement appuyé sur Entrée avec le mauvais répertoire. Étant donné que ce script est destiné uniquement à mon usage (et non à sudo), j'essaie d'ajouter un contrôle d'intégrité, pas un contrôle de sécurité au début du script. Doit taper Y et entrer après avoir regardé le répertoire.
J'essaie d'obtenir un chemin absolu et ce que je reçois est
/Documents/git/ProjectGenerator/../NewProject
J'essaie de faire écho
/Documents/git/NewProject
avant de créer le répertoire. (parfois le chemin est beaucoup plus complexe)
En noeud nous avons path.resolve(path)
En php ou c sa realpath(path)
Je n'arrive pas à trouver une commande équivalente dans osx bash, y en at-il une? ou dois-je analyser la chaîne?
$1
est../../../../../System
oufoo bar
?Réponses:
Vous souhaitez passer au répertoire précédent avec
..
et cela pose des problèmes pour trouver le chemin absolu de votre nouveau répertoire (nommé$1
dans votre script, je l'appellerai$new_directory_name
ici) ce sera../$new_directory_name
.Avant de faire
cd
oumkdir
, J'utiliserais lebasename
commande pour afficher le répertoire d'origine ($PWD
le chemin absolu, puis ajouter$new_directory_name
à cela, comme ceci:(ou remplacez le
$(...)
substitution de commandes avec les backticks `...` (ils sont parfois amusants sur stackexchange - voir la section Substitution de commandes deman bash
Je pense que vous pouvez simplement utiliser Parameter Expansion de bash (également dans
man bash
) sur$PWD
au lieu debasename
comme ça:Exemples
Comme pour les mentions user912264, vous pouvez vérifier si
..
est un répertoire accessible en écriture (avecstat -c %a
ou%A
), ou si vous êtes déjà en/
puiscd ..
ne va pas n'importe où nouveau, ou juste regarder pour les erreurs demkdir
, commela source
$(pwd)
donne déjà un chemin absolu vers le répertoire en cours. J'essaie d'éviter de créer un répertoire pour obtenir son chemin absolu.$NEW_DIR
après l'avoir créé et qu'il a déjà un chemin absolu; mon$NEW_DIR
fonctionnera avec un nom de dossier uniquement, pas de chemin (je modifierai ma réponse pour préciser, je le renommerai en$new_directory_name
)De ce commentaire sur le dépassement de pile https://stackoverflow.com/questions/284662/how-do-you-normalize-a-file-path-in-bash#comment81662652_284671
Je suis venu à la conclusion coreutils (que j'avais déjà installé) a le
greadlink
commande qui a la fonctionnalité dont j'ai besoin.NEW_DIR=$(greadlink -f ../$1)
EDIT 1:
la source
greadlink
ne semble pas être dans une installation standard de Debian / coreutils, maisreadlink
est, et semble prendre à peu près autanttime
courir commedirname
, tandis que l'expansion des paramètres de bash (echo ${PWD%/*}/$new_directory_name
) n'enregistre rien avectime
(0m0.000s), juste au cas où quelqu'un a l'intention d'exécuter les commandes BEAUCOUP