বাশ ব্যর্থ হয়ে হোম অক্ষর (~) ব্যবহার করে ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন


16

bashডিরেক্টরিটি ব্যর্থ হলে নিম্নলিখিত পরীক্ষাগুলি কেন পরীক্ষা করে?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktopআসলেই আছে। এটি কোনও ম্যাকের পথে।


সমস্যাটি এই ধরণের স্ক্রিপ্ট নিয়ে

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi

1
ঠিক যখন আপনি করবেন তখন cd "~/Desktop"আপনিও একটি ত্রুটি পান। এটি ভেরিয়েবল হিসাবে উদ্ধৃত বা সংরক্ষণ করতে হবে (উদ্ধৃতি ব্যতীত)। উদাহরণস্বরূপ, a=~/Desktop; cd $a;কাজ করে তবে সার্ভারসফল্টa="~/Desktop"; cd Desktop;
প্রশ্নগুলি

উত্তর:


7

জাস্টিন কোয়ান্টার উত্তর সম্পর্কে তার প্রথম মন্তব্যে তার প্রশ্নটি স্পষ্ট করেছিলেন। তিনি read(বা অন্য কোনও গতিশীল উপায়ে) ব্যবহার করে একটি পাঠ্য লাইনে পড়ছেন এবং টিল্ডটি প্রসারিত করতে চান।

প্রশ্নটি হয়ে যায় "আপনি কোনও ভেরিয়েবলের সামগ্রীতে টিলডে সম্প্রসারণ কীভাবে করবেন?"

সাধারণ পদ্ধতিটি ব্যবহার করা হয় evalতবে এটি >ভেরিয়েবলের কিছু গুরুত্বপূর্ণ ক্যাভ্যাটস, স্পেস এবং আউটপুট পুনর্নির্দেশ ( ) সহ আসে । নিম্নলিখিতটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

নিম্নলিখিত প্রতিটি ইনপুট দিয়ে এটি ব্যবহার করে দেখুন:

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

ব্যাখ্যা

  • ${mypath//>}আউট রেখাচিত্রমালা >অক্ষর সময় একটি ফাইল পরাস্ত পারে eval
  • eval echo ...কি প্রকৃত টিল্ড সম্প্রসারণ নেই
  • এর আশেপাশের ডাবল-কোটগুলি evalস্পেস সহ ফাইলের নামের জন্য।

এর পরিপূরক হিসাবে, আপনি -eপড়ার বিকল্পটি যুক্ত করে ইউএক্সকে উন্নত করতে পারেন:

read -p "Provide the destination directory: " -e DESTINATION

এখন যখন ব্যবহারকারী টিলডে টাইপ করে এবং ট্যাবে হিট করে এটি প্রসারিত হবে। এই পদ্ধতির উপরের ইওল পদ্ধতির প্রতিস্থাপন হয় না , তবে, সম্প্রসারণ কেবল তখনই ঘটে যখন ব্যবহারকারী ট্যাবকে হিট করে। যদি সে কেবল ~ / foo টাইপ করে এবং হিট প্রবেশ করে তবে এটি টিল্ড হিসাবে থাকবে।

আরো দেখুন:


23

ডিরেক্টরিটি কাজ করে কিনা তা দেখতে ডাবল কোটগুলি সরিয়ে ফেলুন:

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

এটির কারণ হ'ল টিলডে সম্প্রসারণ কেবল তখনই কাজ করে যখন এটি অকেজো হয়।

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

কীভাবে গতিশীলভাবে মানটি আসে। অর্থাৎ ( pastie.org/4471350 ) এবং DESTINATIONহয় ~/Desktop
জাস্টিন

3
টিলড-এক্সপেনশনটি যখন ভেরিয়েবল সেট করা হয় তখন এটির মূল্যায়ন করা হয় না, তাই এটি কোনও নিখুঁত উদাহরণ নয়।
ম্যাডহ্যাটার

+1, এটি আমার সমস্যা সমাধানের জন্য যথেষ্ট।
ফ্লাইং ফিশার

4

এটি কেবল ম্যাকের জন্যই নয় তবে কোনও প্ল্যাটফর্মেও কাজ করে না যা বাশ অন চালায়।

আপনি যখন "~ / ডেস্কটপ" উদ্ধৃত করেন আপনি বাশকে ~ ফোল্ডারের ভিতরে ডেস্কটপ সন্ধান করতে বলছেন। উদ্ধৃতিটি ~ এর বিশেষ উদ্দেশ্যটি সরিয়ে দেয় ~

দেখুন - http://www.gnu.org/software/bash/manual/bashref.html#Tilde- এক্সপেনশন

ডাবল উদ্ধৃতি সরান এবং এটি কাজ করা উচিত।


1

চালান

echo $HOME

ব্যবহার করুন $HOMEএবং নিশ্চিত করুন যে ব্যবহারকারী আসলে স্ক্রিপ্টটি ব্যবহার করছে। রুট যদি এর ~সন্ধান করতে যায় তবে তা ব্যবহার করে /rootনা /home/$USER

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

instead এর পরিবর্তে OME হোম হওয়া উচিত ~

একটি কীবোর্ড জিনিস


আপনি যদি এখানে অন্য উত্তরটি পড়েন তবে বুঝতে পারবেন এটি ভুল।
ছানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.