2017-02-22 1 views
1

J'écris un script bash pour automatiser notre processus de construction. J'ai besoin de stocker un chemin dans un fichier plist de paramètres et de le récupérer dans un script shell, en utilisant plistbuddy.

La clé indique below le chemin où les archives sont stockées, un dossier sur le bureau:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>archives_path</key> 
    <string>$HOME/Desktop/Archives/</string> 
</dict> 
</plist> 

Dans mon script shell-je accéder à la clé:

SETTINGS_PATH="path/to/plist/file" 

ARCHIVES=$(/usr/libexec/PlistBuddy -c "Print archives_path" "$SETTINGS_PATH") 
#outputs "$HOME/Desktop/Archives/" 

mkdir "$ARCHIVES/test/" 
#outputs "mkdir: $HOME/Desktop/Archives: No such file or directory" 

Le ARCHIVES var est pas expansion à /Users/*username*/Desktop/Archives/, comme je m'y attends.

j'ai fait un test en créant un var avec la même chaîne:

ARCHIVES="$HOME/Desktop/Archives/" 

echo "$ARCHIVES" 
#expands to "/Users/*username*/Desktop/Archives/" 

mkdir "$ARCHIVES/test/" 
#creates the 'test' directory 

Comme ce script sera exécuté sous un compte d'utilisateur inconnu comment puis-je forcer le répertoire $ HOME pour développer correctement.

+0

Essayez 'mkdir' avec option' -p'. – Cyrus

+0

@Cyrus 'mkdir -p $ ARCHIVES' crée un dossier nommé' $ HOME' sur le bureau, contenant les dossiers 'Desktop/Archives/test /'. – demosp

Répondre

1

Votre $ARCHIVE renvoyé par le PlistBuddy contient un littéral $HOME.

démonstration simple:

str='$HOME/tmp/somefile' 
echo "The HOME isn't expanded: [[$str]]" 

il imprime:

The HOME isn't expanded: [[$HOME/tmp/somefile]] 

Vous pouvez utiliser eval pour l'expansion comme:

expanded_str1=$(eval "echo $str") 
echo "The HOME is DANGEROUSLY expanded using eval: [[$expanded_str1]]" 

qui imprime

The HOME is DANGEROUSLY expanded using eval: [[/Users/jm/tmp/somefile]] 

Mais l'utilisation de eval est dangereuse! Evaling une chaîne qui n'est pas absolument sous votre contrôle est vraiment dangereux. Par conséquent, vous devez remplacer manuellement la valeur littérale $HOME par la valeur réelle . Il peut être fait avec beaucoup de façons, par exemple:

expanded_str2="${str/\$HOME/$HOME}" 
# or 
expanded_str2=$(echo "$str" | sed "s!\$HOME!$HOME!") 
# or 
expanded_str2=$(echo "$str" | perl -plE 's/\$(\w+)/$ENV{$1}/g') 
# or ... other ways... 

En utilisant

echo "$expanded_str2" 

impressions

/Users/jm/tmp/somefile