আমি কেন উদ্ধৃত টিলডে ('~') সিডি করতে পারি না?


32

আমার প্রথম স্ক্রিপ্ট লেখা তাই আমি নিশ্চিত যে এটি একটি প্রাথমিক প্রশ্ন, তবে কেউ দয়া করে আমাকে ব্যাখ্যা করতে পারেন কেন আমি পারি:

cd ~
cd bin
cd ~/bin
cd 'bin'

কিন্তু না

cd '~'
cd '~/bin'

আমি প্রয়োজন cd, ডিরেক্টরির নাম এক একটি স্পেস দিয়ে একটি ডিরেক্টরি পথে তাই আমি কোট (এটা উইন্ডোজ এর প্রয়োজন Program Filesওয়াইন অধীনে)। আমি দুটি cdকমান্ড দিয়ে এর চারপাশে যেতে পারি , তবে কেন আমি ~উদ্ধৃতি রাখতে পারি না ?

যদি আমি টাইপ করি cd '~'(বা cd "~") আমি পাই:

bash: cd: ~: No such file or directory

29
নিজেকে এটি জিজ্ঞাসা করুন: যদি সেভাবে কাজ না করা হয় তবে আপনি কীভাবে cdনামের একটি ডিরেক্টরিতে যাবেন ~?
জার্গ ডব্লু মিট্টাগ

2
সাইডনোট হিসাবে, আপনি যদি কোনও স্ক্রিপ্ট লিখছেন তবে আপনার উচিত বরং নিখুঁত পথগুলি ব্যবহার করা এবং পুরোপুরি এড়ানো উচিত cd। আপনি একাধিক বার টাইপ করতে চান না এমন পাথের নাম সংরক্ষণ করতে ভেরিয়েবলগুলি ব্যবহার করুন, যেমনpf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
মিষ্টান্ন

8
@ জামেস্কেফ: কেন আমি আমার ফাইল এবং ডিরেক্টরিগুলির নাম বলতে চাই তা একটি বুদ্ধিমান সিস্টেম আমার চেয়ে আরও ভাল করে জানতে পারে? এছাড়াও, আমি কখনই বুঝতে পারি নি কেন ইউনিক্স পাথ উপাদান বিভাজক এবং পাথ টার্মিনেটরগুলির ম্যাজিক ইন-ব্যান্ড সংকেত দিয়ে চলেছিল। একটি ফাইল / নামে ডিরেক্টরির কি সমস্যা রয়েছে /বা NUL?
জার্গ ডব্লু মিট্টাগ

3
@ জার্গডব্লিউমিতাগল সম্ভবতঃcd ./~
কে_জি

2
@ জেমসেকফ জাস্ট নোট হিসাবে thatতিহাসিকভাবে, ইউনিক্স ফাইল সিস্টেমগুলি '/' (পাথ বিভাজক) এবং '\ 0' (NUL - স্ট্রিং-টার্মিনেশন চর) ব্যতীত কোনও ফাইলনামে কোনও চরকে অনুমতি দেয়। অন্য কোনও বিধিনিষেধ নেই। অনেকগুলি ইউনিক্স ফাইল সিস্টেম বাস্তবায়ন হয়েছে, সুতরাং তাদের যে কোনও একটিতে সীমাবদ্ধতা প্রবর্তনের ফলে সামঞ্জস্যতা এবং জটিলতা বৃদ্ধি পেয়েছিল - এবং "অদ্ভুত" হিসাবে দেখা হত! এবং 'expansion' সম্প্রসারণ কেবল তুলনামূলকভাবে সম্প্রতি সিএসএস এবং আরও ব্যাপকভাবে ব্যাশে প্রবর্তিত হয়েছিল, '~' অক্ষরযুক্ত ফাইল / ডায়ার অজানা নয় (যেমন মাইফাইলে ~ মাইফাইলে ব্যাকআপ হিসাবে)।
SusanW

উত্তর:


78

@ কারেল তার উত্তরে উল্লেখ করেছে যে, ~একটি বিশেষ চরিত্র এবং এটি বাশ দ্বারা বর্তমান ব্যবহারকারীর হোম ডিরেক্টরিতে প্রসারিত। "টিলড্ড এক্সপেনশন" এ বাশের ম্যানুয়ালটি দেখুন বা ম্যান পৃষ্ঠাতে "টিল্ডে সম্প্রসারণ" শিরোনামটি অনুসন্ধান করুন man bash

চারপাশে যে কোনও ধরণের উদ্ধৃতি ~এই টিলডের সম্প্রসারণকে বাধা দেয়।


আপনি কীভাবে এখনও cdএটির নামে ফাঁকা জায়গায় একটি ডিরেক্টরিতে এটি ব্যবহার করতে পারেন সে সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য কয়েকটি বিকল্প রয়েছে:

  • উদ্ধৃতি ছেড়ে দিন এবং পরিবর্তে ব্যাকস্ল্যাশ সহ ফাঁকা স্থানগুলি ছেড়ে দিন:

    cd ~/foo/spaces\ are\ cool/bar
  • বাকি পথটির উদ্ধৃতি দিন তবে টিলড এবং প্রথম স্ল্যাশের চারপাশে এগুলি বাদ দিন:

    cd ~/"foo/spaces are cool/bar"

    আপনি দেখতে পাচ্ছেন, আপনি বাশের মধ্যে উদ্ধৃত এবং অব্যক্ত স্ট্রিংগুলি একে অপরের পাশে কেবল কোনও ফাঁকা জায়গা না করে লিখে লিখে ফেলতে পারেন।

  • টিলডের $HOMEপরিবর্তে পরিবেশ পরিবর্তনশীল ব্যবহার করুন , যা এখনও "ডাবল উদ্ধৃতি" এর অভ্যন্তরে প্রসারিত হয় (তবে 'একক উদ্ধৃতি' নয়):

    cd "$HOME/foo/spaces are cool/bar"

3
@rexkogitans ~'/...'কাজ করবে না এবং এই উত্তরটি যা দেয় তা নয়। ~/'...'বা ~/"..."কাজ করবে।
এইচডিভি

tld; dr: কারণ শেল সিনট্যাক্সের উপর
নির্ভর করে

@ এইচডিডি ধন্যবাদ ফিক্সড টাইপ এটি সর্বাধিক সম্পূর্ণ উত্তর এবং ওপি কী করতে চায় তা কীভাবে সমাধান করতে হয় তাও ব্যাখ্যা করে। ~/'path'যাবার উপায়
রেক্সকোগিটানস

1
@hvd কৌতূহল সামান্য, কেন ~'/...'কাজ করবে না ? স্ল্যাশ কোনও বিশেষ চরিত্র নয় তাই মনে হয় এটি কোটের ভিতরে বা বাইরে কাজ করা উচিত।
কোডস জনসন

6
@ কোডোস জনসন "টিল্ড প্রসারণ" সম্পর্কে বাশ ম্যানপেজের বিভাগটি দেখুন। এর প্রাসঙ্গিক অনুচ্ছেদটিও নীচে মিষ্টির উত্তরে উদ্ধৃত করা হয়েছে। টিএল; ডিআর: টিলেডের সম্প্রসারণ ঘটে যদি কোনও শব্দের মধ্যে প্রথম অক্ষরটি একটি অব্যক্ত টিলড হয়, তবে সেই টিলড এবং পরবর্তী অনাবৃত স্ল্যাশের মধ্যে থাকা সমস্ত কিছুই "টিল্ড উপসর্গ" হিসাবে বিবেচিত হবে। যদি এই উপসর্গটি +, -, একটি সংখ্যা, বা ব্যবহারকারীর নাম (কোনও উক্তির মধ্যে কোট অনুমোদিত হয় না) এর মতো বৈধ জিনিস না হয় তবে সম্প্রসারণ ব্যর্থ হয় এবং আপনি একটি আক্ষরিক ~ অক্ষর পান।
বাইট কমান্ডার

17

একটি বিশেষ চরিত্র যা শেল দ্বারা লগ ইন করা ব্যবহারকারীর হোম ডিরেক্টরি হিসাবে ব্যাখ্যা করা হয়। '~' শেল দ্বারা আক্ষরিক ~ অক্ষর হিসাবে ব্যাখ্যা করা হয়, ব্যবহারকারীর হোম ডিরেক্টরি হিসাবে লগইন করা হয় না কারণ দুটি একক উদ্ধৃতি অক্ষরের অভ্যন্তরে একটি স্ট্রিং আবদ্ধ করলে ফলাফলটি আক্ষরিক পাঠ্য স্ট্রিং হিসাবে ব্যাখ্যা করা যায় inter


~অর্থে bashএটির অর্থ ব্যাখ্যা করে না যে এটি একটি সাধারণ কমান্ডের প্রথম শব্দ হিসাবে ব্যবহৃত হয়, যখন কোনও শব্দ একটি স্ট্রিং প্রতিস্থাপনের জন্য অনুমতি দেয়। । আমি নীচে আমার উত্তরে ব্যাখ্যা হিসাবে, এটি বরং একটি বিস্তৃতি।
মিষ্টান্ন

15

এটি টিল্ড এক্সপেনশনbash নামে একটি বৈশিষ্ট্য । উদ্ধৃতি :man bash

একটি শব্দ যদি একটি অব্যক্ত টিল্ড অক্ষর (`~ ') দিয়ে শুরু হয়, তবে প্রথম অনাবৃত স্ল্যাশের পূর্ববর্তী সমস্ত অক্ষর (বা সমস্ত অক্ষর, যদি কোন উদ্বৃত্ত স্ল্যাশ না থাকে) টিলড-উপসর্গ হিসাবে বিবেচিত হয়। যদি টিলডে উপসর্গের কোনও অক্ষর উদ্ধৃত না হয়, তিল্ডের পরে টিলডে উপসর্গের অক্ষরগুলি একটি সম্ভাব্য লগইন নাম হিসাবে গণ্য হবে। এই লগইনটির নামটি যদি নাল স্ট্রিং হয় তবে শিল প্যারামিটারের হোমমের সাথে টিল্ডটি প্রতিস্থাপন করা হবে। যদি হোমটি সেট না করা থাকে, তার পরিবর্তে শেল চালানো ব্যবহারকারীর হোম ডিরেক্টরিটি পরিবর্তিত করা হবে।

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

  1. কমপক্ষে যে অক্ষরগুলির একক উদ্ধৃতি দিয়ে উদ্ধৃতি প্রয়োজন তা উদ্ধৃত করুন

    ~/dir' 'with' 'spaces/

    অথবা

    ~/'dir with spaces/'
  2. কমপক্ষে যে অক্ষরগুলিকে ডাবল উদ্ধৃতি দিয়ে উদ্ধৃত করা দরকার তা উদ্ধৃত করুন, যেমন

    ~/dir" "with" "spaces/

    অথবা

    ~/"dir with spaces/"
  3. ব্যাকস্ল্যাশগুলির সাথে উদ্ধৃতি দেওয়ার জন্য কেবল এমন অক্ষরগুলি উদ্ধৃত করুন, যেমন

    ~/dir\ with\ spaces/

টিল্ড এক্সপেনশনে আরও কিছু আকর্ষণীয় বৈশিষ্ট্য রয়েছে, যেমন:

  • ~+PWDবর্তমান ওয়ার্কিং ডিরেক্টরি এর মান হিসাবে প্রসারিত হয়
  • ~-OLDPWDপূর্ববর্তী ওয়ার্কিং ডিরেক্টরি হিসাবে মান হিসাবে প্রসারিত হয়
  • ~john লগইন নাম "জন" এর সাথে যুক্ত হোম ডিরেক্টরিতে প্রসারিত

ঘটনাক্রমে, ব্যাকস্ল্যাশগুলি 'ওভারকোট' করাও ঠিক; যেমন $ touch a; cd \a,। (আমি ভেবেছিলাম এটির সাথে সমস্যা হতে পারে cd \nতবে আমার সংস্করণে কমপক্ষে পরীক্ষামূলকভাবে bashএটি ভাল কাজ করার পরামর্শ দেয়))
এলস্পাইস

1

echoকমান্ড ব্যবহার করে এক্সপ্লোর করুন

echoকমান্ডের সাহায্যে জিনিসগুলি কীভাবে কাজ করে তা অন্বেষণের সহজ উপায় । এটি ~ব্যবহারের ক্ষেত্রে :

$ echo ~
/home/rick
$ echo '~'
~
$ echo "~"
~
$ echo `~`
bash: /home/rick: Is a directory

আপনি দেখতে পাচ্ছেন, আপনি যখন একক উদ্ধৃতিটি ব্যবহার করেন বা চারপাশে ডাবল কোট ব্যবহার করেন তখন ~আক্ষরিকভাবে স্ট্রিং হিসাবে ব্যাখ্যা করা হয় এবং ভেরিয়েবল হিসাবে প্রসারিত হয় না। আপনি যখন ব্যাকটিক্স (`) ব্যবহার করেন এটি কমান্ড হিসাবে কার্যকর হয় এবং একটি ত্রুটি বার্তা উত্পন্ন করে।

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