web-dev-qa-db-fra.com

Pourquoi mkdir échoue-t-il (aucun fichier ou répertoire de ce type) dans un script avec BIN_DIR = "~ / bin /"?

Pourquoi la commande mkdir échoue-t-elle avec: "Aucun fichier ou répertoire de ce type"?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi
10
Hendré

Le message d'erreur est généré car le tilde ~ est cité, comme décrit dans Zanna's answer . Si vous souhaitez utiliser le ~, la partie pertinente du script doit être:

BIN_DIR=~/bin/

Si pour quelle que soit la raison vous voulez citer la chaîne, vous pouvez utiliser la variable d'environnement $HOME:

BIN_DIR="$HOME/bin/"

À mon avis, la deuxième approche est la meilleure pratique.

9
pa4080

Cela ne fonctionne pas car ~ est cité. Double quotes" supprimer expansion du tilde . Il n'y a pas de répertoire portant le nom littéral ~/bin. Comme expliqué dans man bash (souligné par moi):

Expansion Tilde

Si un mot commence par un caractère sans guillemets tilde (`~ '), tous les caractères précédant la première barre oblique sans guillemets (ou tous les caractères, s'il n'y a pas de barre oblique non rajoutée) sont considérés comme un préfixe tilde. Si aucun des caractères du préfixe tilde n'est cité, les caractères du préfixe tilde suivant le tilde sont traités comme un nom de connexion possible. Si ce nom de connexion est la chaîne NULL, le tilde est remplacé par la valeur du paramètre Shell HOME. Si HOME n'est pas défini, le répertoire de base de l'utilisateur exécutant le shell est remplacé. Sinon, le préfixe tilde est remplacé par le répertoire de base associé au nom de connexion spécifié.

Vous pouvez supprimer les guillemets , étant donné que ~ est le seul caractère du chemin ~/bin qui entraînera une expansion du shell et nous souhaitons le développer dans ce cas. Le shell n'effectuera pas d'autres développements sur le résultat de l'expansion du tilde, au moins dans Bash 4 , qu'ils soient tous actuels ou à distance récents. les versions de Ubuntu ont . Donc, même si votre répertoire personnel contient des caractères inhabituels tels que des espaces, tout va bien.

Vous pouvez également utiliser $HOME à la place de ~, car le paramètre de développement n'est pas supprimé par les guillemets doubles, uniquement par guillemets simples . Les guillemets doubles font garantissent que la valeur développée n'est pas elle-même sujette à d'autres développements, donc la division du mot ou l'extension de nom de fichier ne se produira pas. Donc, $HOME fonctionne même avec des répertoires de départ avec un nom étrange, aussi longtemps que vous gardez les guillemets.

22
Zanna