হোম ~ সর্বদা সমান OME


40

আমি জানি এটি সম্ভবত আগে জিজ্ঞাসা করা হয়েছিল, তবে আমি গুগলের সাথে এটি খুঁজে পাইনি।

প্রদত্ত

  • লিনাক্স কার্নেল
  • কোনও কনফিগারেশন নেই যা change হোম পরিবর্তন করে
  • সজোরে আঘাত

হবে ~ == $HOMEসত্য হবে?


3
আমি এটি বিশ্বাস করি, তবে এটি কোনও লিনাক্স-নির্দিষ্ট সমস্যা নয়। বরং আমি বিশ্বাস করি যে কোনও পসিক্স পরিবেশে ~সমান হবে $HOME; তবে আমি ভুল হতে পারি।
HalosGhost

4
নীচে উত্তর থাকা সত্ত্বেও ... সবসময় না। তুলনা echo "~"এবং echo "$HOME"
স্পারহক

@ স্পারহাক অপেক্ষা করুন, সুতরাং 1 + 1 2 নয় ? এটা একটা ষড়যন্ত্র! সরকার আমাদের কাছ থেকে কিছু গোপন করছে! : পি
ডোরকনব

1
@ স্পারহাক, আপনি লক্ষ্য করবেন যে ওপি আসলে ~বা এর কোনও উদ্ধৃতি দেয় নি $HOME। : পি
হালোসঘস্ট

2
@ হ্যালসগোস্ট আহ, ভাল কথা। (এছাড়াও, আমি পরে লক্ষ্য করেছি যে মাইকেল হোমার এর উত্তরে "একক অব্যক্ত ~" উল্লেখ করা হয়েছে ।) যাইহোক, আমার মতো নৈমিত্তিক পাঠকের মনে রাখার মতো কিছু।
স্পারহাক

উত্তর:


46

যেটি বোঝার জন্য গুরুত্বপূর্ণ তা হ'ল ~সম্প্রসারণ শেলটির বৈশিষ্ট্য (কিছু শেলের), এটি আপনার হোম ডিরেক্টরি যেখানেই ব্যবহৃত হয় তার চেয়ে কোনও যাদু চরিত্র নয়।

এটি প্রসারিত হয় (শেল দ্বারা, যা কমান্ড লাইনের ব্যাখ্যার জন্য ব্যবহৃত একটি অ্যাপ্লিকেশন), যেমন $varকমান্ড কার্যকর হওয়ার আগে শেল কমান্ড লাইনে ব্যবহৃত হলে কিছু শর্তে এর মানতে প্রসারিত হয়।

সেই বৈশিষ্ট্যটি প্রথম 1970-এর দশকের শেষের দিকে সি-শেলটিতে হাজির হয়েছিল (বোর্ন শেলটি ছিল না, বা এর পূর্বসূরী থম্পসন শেলও ছিল না) পরে কর্ন শেলের সাথে যুক্ত হয়েছিল (বোর্ন শেলের উপর একটি নতুন শেল নির্মিত হয়েছিল) 80s)। এটি অবশেষে পসিক্স দ্বারা প্রমিত করা হয়েছে এবং এখন নন-পসিক্সগুলি সহ বেশিরভাগ শেলগুলিতে উপলভ্য fish

শেলগুলিতে এটি এত বিস্তৃত ব্যবহারের কারণে, কিছু শেলবিহীন অ্যাপ্লিকেশনগুলি এটিকে হোম ডিরেক্টরি হিসাবে বোঝায়। এটাই তাদের কনফিগারেশন ফাইল বা তাদের অনেক অ্যাপ্লিকেশনের ক্ষেত্রে নিজস্ব কমান্ড লাইন ( mutt, slrn, vim...)।

bashবিশেষত (যা জিএনইউ প্রকল্পের শেল এবং বহুল লিনাক্স-ভিত্তিক অপারেটিং সিস্টেমগুলিতে বহুল ব্যবহৃত হয়) যখন ডাকা হয় sh, বেশিরভাগই প্রসারণ সম্পর্কে পসিক্স নিয়ম অনুসরণ করে ~এবং পসিক্স দ্বারা নির্দিষ্ট না করা অঞ্চলে বেশিরভাগ কর্ন শেলের মতো আচরণ করে (এর যা এটি একটি অংশ ক্লোন)।

যদিও $var(অভ্যন্তরীণ একক উদ্ধৃতি ছাড়া) অধিকাংশ জায়গায় সম্প্রসারিত হয়, ~সম্প্রসারণ, একটি অনুচিন্তা মাত্র কয়েক নির্দিষ্ট অবস্থায় সম্প্রসারিত হচ্ছে।

তালিকা প্রসংগে তার নিজস্ব যুক্তিতে, স্ট্রিং আশা করা হয় এমন প্রেক্ষাপটে এটি প্রসারিত হয়।

এটি যেখানে সম্প্রসারিত হয়েছে তার কয়েকটি উদাহরণ এখানে রয়েছে bash:

  • cmd arg ~ other arg
  • var=~
  • var=x:~:x(পসিক্স দ্বারা প্রয়োজনীয়, যেমন ভেরিয়েবলের জন্য ব্যবহৃত PATH, MANPATH...)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]]( ~এটি অ্যান্ড টি তে একটি নিদর্শন হিসাবে গ্রহণের সম্প্রসারণ kshকিন্তু bash4.0-এর পরে নয় )।
  • case ~ in ~) ...
  • ${var#~} (যদিও অন্য কোনও শাঁসে নেই)
  • cmd foo=~(যদিও হিসাবে আহ্বান করা হয়নি sh, এবং কেবল তখন যখন বামদিকে রয়েছে =কোনও অব্যক্ত bashভেরিয়েবল নামের আকারের হয় )
  • cmd ~/x (অবশ্যই পসিক্স দ্বারা প্রয়োজনীয়)
  • cmd ~:x(তবে না x:~:xবা x-~-x)
  • a[~]=foo; echo "${a[~]} $((a[~]))" (অন্য কোনও শাঁসে নয়)

এটি কয়েকটি উদাহরণ যেখানে এটি প্রসারিত হয়নি:

  • echo "~" '~'
  • echo ~@ ~~(এটিও মনে রাখবেন যে ~uএটি ব্যবহারকারীর হোম ডিরেক্টরিতে প্রসারিত u)।
  • echo @~
  • (( HOME == ~ )), $(( var + ~ ))
  • সহ extglob: case $var in @(~|other))...(যদিও case $var in ~|other)ঠিক আছে)
  • ./configure --prefix=~(যেমনটি --prefixবৈধ পরিবর্তনশীল নাম নয়)
  • cmd "foo"=~(ইন bash, কোটগুলির কারণে)।
  • যখন যেমন প্রার্থনা sh: export "foo"=~, env JAVA_HOME=~ cmd...

এটি কীতে প্রসারিত হবে: অ্যাকাউন্টের ডাটাবেজে বর্তমান ব্যবহারকারীর হোম ডিরেক্টরিতে ~একমাত্র HOMEচলকের সামগ্রীতে বিস্তৃত হয় বা এটি সেট না করা হয় (পসিক্স যে আচরণটিকে অপরিবর্তিত রাখার পরে এটি এক্সটেনশন হিসাবে)।

এটি লক্ষ করা উচিত যে ksh88 এবং bash4.0 এর পূর্বে সংস্করণগুলিতে, টিল্ডের সম্প্রসারণের তালিকা প্রসঙ্গে গ্লোব্বিং (ফাইলের নাম উত্পাদন) হয়েছিল:

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

এটি স্বাভাবিক ক্ষেত্রে সমস্যা হওয়া উচিত নয়।

নোট করুন যেহেতু এটি প্রসারিত হয়েছে, একই সতর্কতা প্রসারণের অন্যান্য ধরণের হিসাবে প্রযোজ্য।

cd ~

উপাদানগুলির $HOMEসাথে শুরু হয় -বা থাকে তা যদি কাজ করে না ..। সুতরাং, কঠোরভাবে বলতে গেলে যে কোনওরকম কোনও পার্থক্য করা খুব সম্ভব না হলেও, এটি লিখতে হবে:

cd -P -- ~

অথবা এমনকি:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

( $HOMEপছন্দ -, +2...) এর মানগুলি কভার করতে বা সহজভাবে:

cd

(যেমন cdআপনাকে কোনও যুক্তি ছাড়াই আপনার হোম ডিরেক্টরিতে নিয়ে যায়)

অন্যান্য শেলগুলির আরও উন্নত ~পরিমাণ রয়েছে। উদাহরণস্বরূপ, মধ্যে zsh, আমাদের আছে:

  • ~4, ~-, ~-2(সমাপ্তির সঙ্গে) আপনার ডিরেক্টরির স্ট্যাকের মধ্যে ডিরেক্টরি (আপনি যে সমস্ত স্থানে করেছি প্রসারিত করতে ব্যবহৃত cdআগে পর্যন্ত)।
  • গতিশীল নামে ডিরেক্টরি । কীভাবে ~somethingপ্রসারিত হচ্ছে তা সিদ্ধান্ত নিতে আপনি নিজের ব্যবস্থাটি সংজ্ঞায়িত করতে পারেন ।

25

যে কোনও সিস্টেমে বাশের যে কোনও সংস্করণে হ্যাঁ~নিজস্ব শব্দ হিসাবে এটি প্রসারিত সংজ্ঞায়িত করা হয়:

$ HOME এর মান

সুতরাং এটি সর্বদা $HOMEবর্তমান শেলের যা কিছু থাকবে তার সমান হবে । সেখানে যেমন বেশ কিছু টিল্ড প্রসারণও হয় ~userজন্য userএর বাড়ি ডিরেক্টরি, কিন্তু একটি একক unquoted ~তার নিজের উপর সর্বদা প্রসারিত হবে "$HOME"

লক্ষ্য করুন আচরণ এর ~এবং $HOMEকিছু ক্ষেত্রে বিভিন্ন হতে পারে: বিশেষ করে, যদি $HOMEস্পেস (অথবা অন্যান্য রয়েছে IFS অক্ষর), তারপর $HOME(unquoted), একাধিক শব্দের প্রসারিত হবে যখন ~সবসময় একটি একক শব্দ। (উদ্ধৃতি) ~সমতুল্য প্রসারিত হয় "$HOME"

আপনার নির্দিষ্ট প্রশ্ন সম্পর্কে:

[[ $HOME == ~ ]]

সর্বদা সত্য, কারণ শব্দ বিভাজনকে [[ দমন করে। এতে প্যাটার্নের সাথে মিলে যাওয়া অক্ষরগুলি [[ ~ == $HOME ]নাও থাকতে পারে , তবে (অর্থাত, উদ্ধৃত ) সর্বদা সত্য। একক বন্ধনীর মধ্যে এটি ব্যবহার করা শূণ্যস্থান বা বিশেষ অক্ষরগুলির মানগুলির জন্য একটি সিনট্যাক্স ত্রুটি হতে পারে । যে কোনও বুদ্ধিমান হোম ডিরেক্টরি কনফিগারেশনের জন্য এবং একই এবং সমান হিসাবে তুলনা করুন।HOME[[ ~ == "$HOME" ]]"$HOME"HOME~"$HOME"


স্টাফেন চেজেলাস মন্তব্যগুলিতে একটি কেস মন্তব্য করেছেন যেখানে কোথায় ~এবং $HOMEবিভিন্ন মান প্রদান করে: আপনি যদি unset HOMEতখন ~বাশ ব্যবহার করেন তখন getpwuidপাসওয়ার্ডের ডাটাবেসের বাইরে কোনও মান পড়তে ডাকবেন । আপনার কনফিগারেশন পরিবর্তন না হওয়ার শর্তে এই কেসটি বাদ দেওয়া হয়েছে $HOME, তবে আমি এখানে এটি সম্পূর্ণতার জন্য উল্লেখ করব।


1
তবে, /bin/shনাও হতে পারে bash। আমি নিশ্চিত নই যে পজিক্সের shস্পেসিফিকেশনটি সম্পর্কে বলেছে~
বেসাইল স্টারিঙ্কেভিচ

1
পসিক্স নির্দিষ্ট করে ~~থমসন বা বোর্ন শেল ছিল না (যে তাদের সময় হিসাবে উপলব্ধ ছিল /bin/sh)। এটা নয় rcবা তার ডেরাইভেটিভস (যেখানে এটা অন্য কিছু জন্য ব্যবহৃত হয়েছে)
Stéphane Chazelas

5
সেট না করা bashথাকলে কয়েকটি শেল পাসওয়ার্ড ডাটাবেস থেকে ব্যবহারকারীর হোম ডিরেক্টরিতে প্রসারিত হয়। সুতরাং এটি এমন একটি ক্ষেত্রে যেখানে এর মান বাড়তে পারে না । HOME~~$HOME
স্টাফেন চেজেলাস

1
নোট করুন যে bashbash4 এর আগে টিলডে সম্প্রসারণের জন্য গ্লোববিং করতেন (চেষ্টা করুন HOME='/*' bash -c 'echo /*')। সুতরাং HOME=/*; [ "$HOME" = ~ ]সেখানে একটি ত্রুটি ফিরে আসবে।
স্টাফেন চেজেলাস

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