Tôi đang viết một tập lệnh được gọi khi người dùng đăng nhập và kiểm tra xem một thư mục nào đó có tồn tại hay là một liên kết tượng trưng bị hỏng. (Đây là trên hệ thống Mac OS X, nhưng câu hỏi hoàn toàn là bash).
Nó không thanh lịch, và nó không hoạt động, nhưng ngay bây giờ nó trông như thế này:
#!/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."
Mấu chốt của vấn đề là việc mở rộng dấu ngã không hoạt động như tôi muốn.
Hãy để chúng tôi nói rằng tôi có một người dùng được đặt tên george
, và thư mục nhà của anh ấy là /a/path/to/georges_home
. Nếu, tại một vỏ, tôi gõ:
cd ~george
nó đưa tôi đến thư mục thích hợp. Nếu tôi gõ:
HOME_DIR=~george
echo $HOME_DIR
Nó đưa cho tôi:
/a/path/to/georges_home
Tuy nhiên, nếu tôi cố gắng sử dụng một biến, nó không hoạt động:
USERNAME="george"
cd ~$USERNAME
-bash: cd: ~george: No such file or directory
Tôi đã thử sử dụng dấu ngoặc kép và backticks, nhưng không thể tìm ra cách làm cho nó mở rộng đúng cách. Làm thế nào để tôi thực hiện công việc này?
Phụ lục
Tôi chỉ muốn đăng kịch bản hoàn chỉnh của mình (thực sự, nó không xấu như công việc đang tiến triển ở trên!) Và nói rằng nó dường như đang hoạt động đúng.
#!/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