Ich schreibe ein Skript, das aufgerufen wird, wenn sich ein Benutzer anmeldet und prüft, ob ein bestimmter Ordner vorhanden ist oder ob ein Symlink defekt ist. (Dies ist auf einem Mac OS X-System, aber die Frage ist rein bash).
Es ist nicht elegant und funktioniert nicht, aber im Moment sieht es so aus:
#!/bin/bash
# Often users have a messed up cache folder -- one that was redirected
# but now is just a broken symlink. This script checks to see if
# the cache folder is all right, and if not, deletes it
# so that the system can recreate it.
USERNAME=$3
if [ "$USERNAME" == "" ] ; then
echo "This script must be run at login!" >&2
exit 1
fi
DIR="~$USERNAME/Library/Caches"
cd $DIR || rm $DIR && echo "Removed misdirected Cache folder" && exit 0
echo "Cache folder was fine."
Der Kern des Problems ist, dass die Tilde-Erweiterung nicht so funktioniert, wie ich es gerne hätte.
Nehmen wir an, ich habe einen Benutzer namens george
und sein Home-Ordner ist /a/path/to/georges_home
. Wenn ich in einer Shell Folgendes eingebe:
cd ~george
es bringt mich in das entsprechende Verzeichnis. Wenn ich tippe:
HOME_DIR=~george
echo $HOME_DIR
Es gibt mir:
/a/path/to/georges_home
Wenn ich jedoch versuche, eine Variable zu verwenden, funktioniert dies nicht:
USERNAME="george"
cd ~$USERNAME
-bash: cd: ~george: No such file or directory
Ich habe versucht, Anführungszeichen und Backticks zu verwenden, kann aber nicht herausfinden, wie ich es richtig erweitern kann. Wie mache ich das?
Nachtrag
Ich wollte nur mein fertiges Skript veröffentlichen (wirklich, es ist nicht so hässlich wie die oben genannten Arbeiten!) Und sagen, dass es richtig zu funktionieren scheint.
#!/bin/bash
# Often users have a messed up cache folder -- one that was redirected
# but now is just a broken symlink. This script checks to see if
# the cache folder is all right, and if not, deletes it
# so that the system can recreate it.
#set -x # turn on to help debug
USERNAME=$3 # Casper passes the user name as parameter 3
if [ "$USERNAME" == "" ] ; then
echo "This script must be run at login!" >&2
exit 1 # bail out, indicating failure
fi
CACHEDIR=`echo $(eval echo ~$USERNAME/Library/Caches)`
# Show what we've got
ls -ldF "$CACHEDIR"
if [ -d "$CACHEDIR" ] ; then
# The cache folder either exists or is a working symlink
# It doesn't really matter, but might as well output a message stating which
if [ -L "$CACHEDIR" ] ; then
echo "Working symlink found at $CACHEDIR was not removed."
else
echo "Normal directory found at $CACHEDIR was left untouched."
fi
else
# We almost certainly have a broken symlink instead of the directory
if [ -L "$CACHEDIR" ] ; then
echo "Removing broken symlink at $CACHEDIR."
rm "$CACHEDIR"
else
echo "Abnormality found at $CACHEDIR. Trying to remove." >&2
rm -rf "$CACHEDIR"
exit 2 # mark this as a bad attempt to fix things; it isn't clear if the fix worked
fi
fi
# exit, indicating that the script ran successfully,
# and that the Cache folder is (almost certainly) now in a good state
exit 0