টিলড (~) ডাবল কোটের ভিতরে কেন প্রসারিত হয় না?


54

মতে এই উত্তর এবং আমার নিজস্ব বুঝতে, টিল্ড হোম ডিরেক্টরিতে বিস্তৃতি:

$ echo ~
/home/braiam

এখন, যখনই আমি শেল প্রসারণটি কাজ করতে চাই, যেমন চলক নামগুলি ব্যবহার $FOOকরি এবং অপ্রত্যাশিত অক্ষরগুলি না ভাঙ্গি, যেমন ফাঁকা স্থানগুলি ইত্যাদির দ্বিগুণ উদ্ধৃতি ব্যবহার করা উচিত ":

$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces

এই সম্প্রসারণ টিলডের সাথে কাজ করে না কেন?

$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path


3
আরও মনে রাখবেন যে কমান্ড লাইনে একটি প্রোগ্রাম আর্গুমেন্ট সরবরাহ করার সময় এটির অসামঞ্জস্যতা রয়েছে যা কমান্ড আর্গুমেন্টে --path ~/myfileপ্রসারিত --path=~/myfileহয় না কিন্তু হয় না।
অ্যাঞ্জেল



এই থিমটিতে একটি প্রকরণ হ'ল unix.stackexchange.com/questions/279565
JdeBP

উত্তর:


45

কারণ, ডাবল উদ্ধৃতিগুলির ভিতরে, টিলডের ~কোনও বিশেষ অর্থ নেই, এটি আক্ষরিক হিসাবে ধরা হয়।

পসিক্স ডাবল-কোটগুলি এরূপ হিসাবে সংজ্ঞায়িত করে :

ডাবল-কোট ("")-তে অক্ষরগুলি সংযুক্ত করা ডলার চিহ্ন, ব্যাককোয়াইট এবং ব্যাকস্ল্যাশ ব্যতীত ডাবল-কোটসের মধ্যে সমস্ত অক্ষরের আক্ষরিক মান সংরক্ষণ করবে,

...

অ্যাপ্লিকেশনটি নিশ্চিত করবে যে একটি ডাবল-কোট আগে ডাবল-কোটের মধ্যে অন্তর্ভুক্ত করার জন্য একটি ব্যাকস্ল্যাশ এর আগে। '@' পরামিতিটির ডাবল-কোটের ভিতরে বিশেষ অর্থ রয়েছে has

ছাড়া $, `, \এবং @অন্যান্যের অক্ষর উদ্ধৃতি চিহ্ন ভিতরে যেমন আক্ষরিক চিকিত্সা করা হয়।


9
কোন ক্ষেত্রে আমার ধারণা আপনার ব্যবহার করা উচিত $HOME
শেঠ

11
অথবা আপনি কেবল উদ্ধৃত করতে পারবেন না ~, উদাহরণস্বরূপls -l ~/"My Documents"
অ্যান্ড্রু মেডিকো

এটি খুব স্বজ্ঞাত। তারা এই কারণটি বেছে নেওয়ার কারণ কী? (এই উত্তরটি আসলে কারণ দেয় না, বরং কেবল মানকে নির্দেশ করে, তবে সম্ভবত স্ট্যান্ডার্ডটি কোনও কারণে সেইভাবে লেখা হয়েছিল ))
আইকনোক্লাস্ট

1
@ আইকনোক্লাস্ট যদি আপনি সত্যিই কোনও "কেন তারা এইভাবে প্রয়োগ করলেন" চান তবে তার পরিবর্তে স্টিফেন উত্তরটি পড়ুন ।
ব্রেইম

2
সুতরাং, @iconoclast, কেন হয় আকাশ নীল? :) :) :)
জেসি

32

টিলডে সম্প্রসারণ POSIX দ্বারা এই হিসাবে সংজ্ঞায়িত করা হয়েছে:

একটি " টিলডে উপসর্গ" শব্দের শুরুতে একটি অব্যক্ত < শিরোনাম > চরিত্র নিয়ে গঠিত হয় , তারপরে শব্দের প্রথম অব্যক্ত <স্ল্যাশ> এর পূর্ববর্তী সমস্ত অক্ষর বা শব্দের সমস্ত অক্ষর থাকে না <তবে < স্ল্যাশ>। একটি অ্যাসাইনমেন্টে, একাধিক টিল্ড-উপসর্গ ব্যবহার করা যেতে পারে: [...] অ্যাসাইনমেন্টের <aquals- সাইন> অনুসরণ করে, কোনও অব্যক্ত <colon>, বা উভয়ই অনুসরণ করে। [...] টিলডে উপসর্গের কোনও একটি অক্ষর উদ্ধৃত না হলে, <টিલ્ડ্ড> এর পরে টিলডে উপসর্গের অক্ষরগুলি ব্যবহারকারীর ডাটাবেস থেকে সম্ভাব্য লগইন নাম হিসাবে বিবেচিত হবে। [...] লগইন নামটি যদি নাল হয় (তবে টিলড-উপসর্গটিতে কেবল টিলড থাকে), টিলড-উপসর্গটি ভেরিয়েবলের মূল মান দ্বারা প্রতিস্থাপিত হবে H যদি হোমটি সেট না করা থাকে তবে ফলাফলগুলি অনির্দিষ্ট। [...]

সুতরাং সবচেয়ে সংক্ষিপ্ত উত্তরটি "কারণ এটি সেইভাবে সংজ্ঞায়িত করা হয়েছে": উপসর্গের সহ উপসর্গের যে কোনও একটি অক্ষরের উদ্ধৃতি ~, প্রসারণকে বিস্তৃত করে।

এটি সর্বদা একক শব্দের ফলে সম্প্রসারণকেও সংজ্ঞায়িত করে, সুতরাং উদ্ধৃতিটি অপ্রয়োজনীয় হবে:

টিলডে সম্প্রসারণের ফলে যে পথটির নাম তা ক্ষেত্র বিভাজন এবং পথের নাম দ্বারা প্রসারণ দ্বারা পরিবর্তিত হওয়া রোধ করার জন্য উদ্ধৃত করা হবে।

যেখানে কয়েকটি পাথের উদ্ধৃতি প্রয়োজন, তবে বাকীটি টিল্ড উপসর্গ রয়েছে, আপনি তিল্ডের সম্প্রসারণ এবং সাধারণ উদ্ধৃতিটি সোজাভাবে একত্রিত করতে পারেন:

$ cat ~/"file name with spaces"

বিস্তৃত "কেন" তে: যেহেতু শব্দ বিভাজনের জন্য কোনও অনুমেয়যোগ্য ব্যবহার নেই ~, তবে এটি উদ্ধৃত করার প্রয়োজনের পরিবর্তে ডিফল্ট আচরণ হওয়া উচিত। কারণ এটি উদ্ধৃত করার দরকার নেই, ~উদ্ধৃতিগুলির ভিতরে একটি বিশেষ অর্থ প্রদান করা একটি অযথা জটিলতা হবে be এবং, অবশ্যই, reasonsতিহাসিক কারণে মানে এখনই এটি পরিবর্তন করা যায় না যদিও এটি আকাঙ্ক্ষিত ছিল।


এই বাশ গাইড অনুসারে , টিলডে প্রসারণ হোয়াইটস্পেস বিচ্ছিন্ন হওয়ার আগে ঘটে । আপনার হোম ডিরেক্টরিতে শ্বেত স্পেস থাকলেও নিরাপদে টিল্ড সম্প্রসারণ করার কোনও উপায় আছে কি? সাধারণত, অবশ্যই আপনি এই ধরণের জিনিসটি দিয়ে করতেন ""
লুক্রেটিয়েল

সম্প্রসারণ একক শব্দ; উত্তরে দ্বিতীয় উদ্ধৃত প্যাসেজটি দেখুন।
মাইকেল হোমার

23

~ সি-শেল থেকে উত্পন্ন হয়, এটি কর্ন শেলের সাথে যুক্ত হওয়ার পরে এবং পরে পসিক্স শেল স্পেসিফিকেশনটিতে যুক্ত হওয়ার অনেক আগে।

সি-শেলের মধ্যে ~একটি গ্লোব্বিং অপারেটর ছিল ( *.txtউদাহরণস্বরূপ যেটি প্রসারিত হয়েছে তার একই রুটিন দ্বারা প্রসারিত ), সুতরাং বাকী গ্লোব্বিংয়ের মতো ডাবল উদ্ধৃতিতে সঞ্চালিত হয়নি।


11

এটি কেন এইভাবে ডিজাইন করা হয়েছে তার উত্তর দেয় না, $HOMEপরিবর্তে আপনার বিকল্প প্রয়োজন হলে আপনি এটি ব্যবহার করেন , যেহেতু এটি মূলত যা ~করে।

$ echo "$HOME/some/path"
/home/braiam/some/path

6
এটি এর সাথে কাজ করে না~otheruser
জোহানেস কুহান

2
সত্য, তবে আপনি এটি করতে পারেন: THEM = ~ অন্য ব্যবহারকারী তারপরে "$ THEM / কিছু / পথ" ব্যবহার করুন
মেল্ডগুলি

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