যেটি বোঝার জন্য গুরুত্বপূর্ণ তা হ'ল ~
সম্প্রসারণ শেলটির বৈশিষ্ট্য (কিছু শেলের), এটি আপনার হোম ডিরেক্টরি যেখানেই ব্যবহৃত হয় তার চেয়ে কোনও যাদু চরিত্র নয়।
এটি প্রসারিত হয় (শেল দ্বারা, যা কমান্ড লাইনের ব্যাখ্যার জন্য ব্যবহৃত একটি অ্যাপ্লিকেশন), যেমন $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
কিন্তু bash
4.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 এবং bash
4.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
প্রসারিত হচ্ছে তা সিদ্ধান্ত নিতে আপনি নিজের ব্যবস্থাটি সংজ্ঞায়িত করতে পারেন ।
~
সমান হবে$HOME
; তবে আমি ভুল হতে পারি।