কোনও স্ক্রিপ্টে ব্যবহারকারীর নাম সহ, ব্যবহারকারীর হোম ডিরেক্টরিটি সন্ধান করুন


8

আমি এমন একটি স্ক্রিপ্ট লিখছি যা ব্যবহারকারীর লগ ইন করার পরে কল হয়ে যায় এবং নির্দিষ্ট ফোল্ডারটি উপস্থিত আছে কিনা বা ভগ্ন সিমলিংক কিনা তা পরীক্ষা করে দেখছি। (এটি কোনও ম্যাক ওএস এক্স সিস্টেমে রয়েছে তবে প্রশ্নটি নিখুঁতভাবে বাশ।

এটি মার্জিত নয়, এবং এটি কাজ করছে না, তবে এখনই এটি দেখতে এটির মতো দেখাচ্ছে:

#!/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."

সমস্যার সরলতাটি হ'ল টিলডের সম্প্রসারণ আমার পছন্দ মতো কাজ করছে না।

আসুন আমরা বলতে পারি যে আমার একটি ব্যবহারকারী নাম আছে georgeএবং তার হোম ফোল্ডারটি /a/path/to/georges_home। যদি, একটি শেল এ, আমি টাইপ করুন:

cd ~george

এটি আমাকে উপযুক্ত ডিরেক্টরিতে নিয়ে যায়। যদি আমি টাইপ করি:

HOME_DIR=~george
echo $HOME_DIR

এটি আমাকে দেয়:

/a/path/to/georges_home

তবে, আমি যদি একটি চলক ব্যবহার করার চেষ্টা করি তবে এটি কার্যকর হয় না:

USERNAME="george"
cd ~$USERNAME
-bash: cd: ~george: No such file or directory

আমি উদ্ধৃতি এবং ব্যাকটিক্স ব্যবহার করার চেষ্টা করেছি, তবে কীভাবে এটি সঠিকভাবে প্রসারিত করা যায় তা বুঝতে পারি না। আমি এই কাজটি কীভাবে করব?


অভিযোজ্য বস্তু

আমি কেবল আমার সমাপ্ত স্ক্রিপ্টটি পোস্ট করতে চেয়েছিলাম (সত্যিই, এটি উপরে কাজ করার মতো কুৎসিত নয়!) এবং এটি ঠিক কাজ করছে বলে মনে হচ্ছে।

#!/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  

উত্তর:


16

ব্যবহার $(eval echo ...):

michael:~> USERNAME=michael
michael:~> echo ~michael
/home/michael
michael:~> echo ~$USERNAME
~michael
michael:~> echo $(eval echo ~$USERNAME)
/home/michael

সুতরাং আপনার কোডটি দেখতে হবে:

HOMEDIR="$(eval echo ~$USERNAME)"

1
আপনার সঠিক স্ক্রিপ্টের জন্য নির্দিষ্ট +1 সমাধান।
ওয়ার্নার

2

এর কারণ এটি যখন ভেরিয়েবল হিসাবে সেট করা হয় তখন সিঙ্গলকোটের মধ্যে ~ জর্জটি বন্ধ করে দেওয়া হয়। set -xডিবাগিং জন্য দরকারী।

DIRভেরিয়েবল সেট করার সময় উদ্ধৃতি সরিয়ে ফেলুন এবং ভেরিয়েবলটি সেট করার সময় শেলটি প্রসারিত হবে যা আপনাকে আপনার পছন্দসই পারফরম্যান্স দেবে।

lrwxrwxrwx  1 root root 4 Sep 10  2004 /bin/sh -> bash*
wmoore@bitbucket(/tmp)$ cat test.sh
#!/bin/bash
set -x

cd ~root

DIR=~root

cd $DIR

DIR="~root"

cd $DIR
wmoore@bitbucket(/tmp)$ sh test.sh
+ cd /root
test.sh: line 4: cd: /root: Permission denied
+ DIR=/root
+ cd /root
test.sh: line 8: cd: /root: Permission denied
+ DIR=~root
+ cd '~root'
test.sh: line 12: cd: ~root: No such file or directory

1
+1, আমি সেখান থেকে বেরিয়ে ছিলাম :-)
কাইল ব্র্যান্ড্ট

সেট-এক্স একটি দুর্দান্ত টিপ। ডিআইআর থেকে উদ্ধৃতি সরিয়ে ফেলা বাশ ৩.২ এর অধীনে আমার পক্ষে কাজ করে নি।
ক্লিনটন ব্ল্যাকমোর

জিএনইউ বাশ, সংস্করণ 2.05b.0 (1) -রিলেজ (আই 486-স্ল্যাকওয়্যার-লিনাক্স-গনু) এখানে।
ওয়ার্নার

1

ব্যাশের ব্যবহারকারীর নাম এবং ব্যবহারকারীর হোম ডিরেক্টরিতে অন্তর্নির্মিত রফতানি চলক রয়েছে। ~/.bash_profileউদাহরণস্বরূপ যখন ব্যবহারকারী তাদের লগ ইন করে আপনি যদি আপনার স্ক্রিপ্টটি কল করে থাকেন, আপনার স্ক্রিপ্টে আর্গুমেন্ট হিসাবে মানগুলি পাস করার প্রয়োজন হবে না।

আপনি ব্যবহার করতে পারেন $USERএবং $HOMEযেহেতু সেগুলি ইতিমধ্যে সেট করা আছে এবং আপনার স্ক্রিপ্টের পরিবেশে উপলব্ধ রয়েছে যেহেতু এগুলিকে রফতানি হিসাবে চিহ্নিত করা হয়েছে। আমি মনে করি টিপল সম্প্রসারণ বলতে স্ক্রিপ্টগুলিতে ব্যবহার করা কিছু চেয়ে কমান্ড-লাইন সুবিধাকে বোঝানো হয়েছে।

DIR="$HOME/Library/Caches"

cd "$DIR" || rm "$DIR" && echo "Removed misdirected Cache folder" && exit 1

নিম্নলিখিত কোনও একটি ব্যবহারকারীর হোম ডিরেক্টরি পেতে এটি আরও নির্ভরযোগ্য হতে পারে:

getent passwd $USER | awk -F: '{print $(NF - 1)}'

অথবা

awk -F: -v user=$USER 'user == $1 {print $(NF - 1)}' /etc/passwd

এছাড়াও, exit 0সাফল্য নির্দেশ করে। একরকমভাবে, আপনার প্রক্রিয়াটি ডিরেক্টরি মুছতে সফল, তবে এটি মুছে ফেলার প্রয়োজন এটি একটি ধরণের ত্রুটি। যাই হোক না কেন, আপনি যদি exit 0এই মুহুর্তে স্ক্রিপ্টটি ফাইনালের পরে প্রস্থান করে তখন পার্থক্যটি বলতে পারবেন না echoযেহেতু প্রস্থান কোডটি সম্ভবত শূন্য হবে।


+1 এগুলি আমার কিছু শক্ত ছিল, তবে হোম ভেরিয়েবলগুলির সাথে আমার মনে হয় এটি সম্ভবত ব্যবহারকারী হিসাবে চালিত হবে না, কারণ তিনি স্ক্রিপ্টটির তৃতীয় তর্ক যুক্তি দিয়ে USERNAME ভেরিয়েবলটিকে ওভাররাইড করেছেন (যা আমার মাধ্যমেও বন্ধ রয়েছে)। আমি পুরোটাও ভাবি ||এবং &&প্রবাহ নিয়ন্ত্রণ হিসাবে (বিবৃতিগুলির পরিবর্তে) খারাপ শৈলী।
কাইল ব্র্যান্ড্ট

স্ক্রিপ্টটি ক্যাস্পারের মাধ্যমে চলবে। আমি নিশ্চিত নই যে এটি প্রস্থান কোডগুলি দেখে কিনা, তবে এটি যদি হয় তবে আমি এমন কোনও উদাহরণ চাই যেখানে স্ক্রিপ্টটি ক্যাশে ফোল্ডারটি মুছে ফেলে বা স্ক্রিপ্টটির সফল রান নির্দেশ করার জন্য কোনও সন্ধান পায় না এবং যেখানে কোনও ঘটনা যেখানে ত্রুটি হিসাবে দেখানোর জন্য ব্যবহারকারীর নাম সরবরাহ করা হয়নি (লগইন বা লগআউটে স্ক্রিপ্ট নির্দেশ করা হয়নি) provided স্ক্রিপ্টটি কোথায় চলেছে তার লগগুলিতে নজর দিলে ত্রুটিগুলি লালচে পতাকাযুক্ত হয়।
ক্লিনটন ব্ল্যাকমোর

@ ক্লিন্টন: তারপরে আপনি প্রস্থানমূল্যের জন্য একটি শূন্য নং সংখ্যা রাখতে চান ( exit nস্ক্রিপ্টের শেষে একটি স্পষ্ট সহ) যদি পড়েও থাকে তবে এটি একটি ত্রুটি Z জিরো সাফল্যের ইঙ্গিত দেয় এবং আপনি বিভিন্ন শূন্য নম্বর ব্যবহার করতে পারেন বিভিন্ন ধরণের ত্রুটিগুলি নির্দেশ করুন (আপনার নিজের উদ্দেশ্যে তাদের অর্থ নির্ধারণ করা আপনার উপর নির্ভর করে) আপনার যদি অন্য ধরণের ত্রুটির কোনও পার্থক্য করার প্রয়োজন না exit 1হয় তবে সমস্ত ক্ষেত্রে এটি চিহ্নিত করার জন্য যতটা ব্যবহার করা যায় তত ভাল is সাধারণ ত্রুটি।
পরবর্তী ঘোষণা না হওয়া পর্যন্ত বিরাম দেওয়া।

আমার ধারণা ইউনিক্স ইউনিক্স এবং সব একই ... এটি যখন না তখন ছাড়া! দেখা যাচ্ছে যে ম্যাকটিতে জেন্টেন্টের অস্তিত্ব নেই, এবং সাধারণ ব্যবহারকারীরা / ইত্যাদি / পাসডাব্লুডিতে উল্লেখ করা হয় না। ডিএসসিএল-এ ভাইবোন উত্তরটি ওএস এক্সের অধীনে একই তথ্য পাওয়ার একটি উপায়ের পরামর্শ দেয় I আমি আপনার উত্তরটির প্রশংসা করি এবং যুক্তিযুক্ত অপারেটরদের অলস মূল্যায়নের উপর নির্ভর না করার জন্য স্ক্রিপ্টটি ভালভাবে বদলে যেতে পারি।
ক্লিনটন ব্ল্যাকমোর

1

পথে বিচার করা $HOME/Library/Caches, এটি ম্যাক ওএস এক্স, dsclআপনার বন্ধুও।

উপরে উল্লিখিত হিসাবে, bashএটি কি আপনার জন্য রয়েছে, এবং এটি যদি ম্যাক হয় তবে আপনি গ্যারান্টি দিতে পারবেন যে bash(এবং তাই /bin/shএটির সাথে কঠোরভাবে মেনে চলতে না পারার বিষয়ে আপনাকে চিন্তা করার দরকার নেই )।


এটা একটা ভাল দিক. dscl /Search read /Users/$USERNAME NFSHomeDirectory | cut -f 2 -d " "আমি পরে ছিল তথ্য পেতে সঠিক সম্পর্কে বলে মনে হচ্ছে।
ক্লিনটন ব্ল্যাকমোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.