যখন কোনও পথের উপসর্গ হিসাবে ব্যবহৃত হয় তখন a (টিলডে) কী?


11

সম্পাদনা করুন: এটি /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ এর সদৃশ । এই প্রশ্নটিকে সদৃশ হিসাবে বন্ধ করার সুনাম আমার নেই don't

আমি ~হোম ডিরেক্টরি হিসাবে উল্লেখ করছি না বরং এটি:

$ ls ~foo/bar
/some/mount/point/foo/bar

তবে আমি যদি এটির ভিন্ন মাউন্ট পয়েন্ট দিয়ে চেষ্টা করি তবে যেমন:

$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin . 
# bash has a similar error message: 
ls: ~stdin: No such file or directory

~এই প্রসঙ্গে বলা হয় কী ? এটা কিভাবে কাজ করে?

সম্পাদনা করুন: নীচের কয়েকটি মন্তব্যের ভিত্তিতে আরও তথ্য:

  1. আমি প্রমাণ করতে পারি যে fooএটি আমার সিস্টেমে কোনও ব্যবহারকারীর নাম নয়।
  2. স্বতঃপূরণ করার চেষ্টা করার সময় ls -lah ~সমস্ত অপশন দেখানো হয় না। অর্থাত্ আমি সক্ষম cd ~qux, যখন quxস্বতঃপূরণে প্রদর্শিত হবে না। আবার quxআমার সিস্টেমে কোনও ব্যবহারকারী নয়।
  3. এটি যদি গুরুত্বপূর্ণ /some/mount/pointহয় তবে একটি নেটওয়ার্ক শেয়ার।
  4. সমস্ত বিবরণে কিছু নামযুক্ত পথ শঙ্কা, পথের নাম প্রসারণের একটি জেল শেল বৈশিষ্ট্য রয়েছে, তবে এটি বাশেও কাজ করে, যা সম্ভবত জেড শেলের নামযুক্ত পথগুলির মতো জিনিসগুলিকে সমর্থন করে না।

5
~fooব্যবহারকারীর হোম ডিরেক্টরি foo। যদি ব্যবহারকারী নির্দিষ্ট না করা হয় তবে বর্তমান ব্যবহারকারীটি ডিফল্ট।
ডোপঘোতি

তবে এই ক্ষেত্রে, /some/mount/pointঅবশ্যই আমার হোম ডিরেক্টরি নয়। cd ~আমাকে/Users/$username/$HOME
আরডি

1
zshনামযুক্ত ডিরেক্টরিগুলি নির্দেশ করতে টিলড ব্যবহার করে বলে মনে হয়।
ডোপঘোতি

আমারও সন্দেহ হয়েছিল !! কোনও কারণে বাদ দিয়ে উপরের পোস্ট করা কমান্ডের সিরিজটি ব্যাশ-এও কাজ করে ( bash -c "ls ~foo/bar") - যার নাম ডিরেক্টরি নেই। তবুও zsh এর মধ্যেও, যদি আমি পরিদর্শন করি তবে আমি কোনও নামীকৃত envডিরেক্টরি সেট আপ দেখছি না। আমি ম্যাক OS এ আছি এবং আমি মনে করি এই OS এক্স কিছু বৈশিষ্ট্য নির্দিষ্ট
আরডি

1
আপনি কেবল বলেছেন ~foo। আসল স্ট্রিং নিন (উদাহরণ নয় foo) এবং করুন grep "actual username" /etc/passwd। ব্যাশ ম্যানুয়াল অনুসারে ~textশুধুমাত্র সম্ভাব্য লগইন ইউজারনেমগুলির জন্য কাজ করা উচিত (অগত্যা এটি ব্যবহার করে না যে এটি লগ ইন করতে সক্ষম; ~lpউদাহরণস্বরূপ সিস্টেম ব্যবহারকারীদের ক্ষেত্রে )। আমার সমস্ত পরীক্ষায়, ব্যবহারকারীর নাম হওয়ার ~stringসাথে সম্পর্কিত string
সের্গেই কোলোডিয়াজনি

উত্তর:


14

Oo ফুও কি?

বাশ ম্যানুয়াল থেকে উদ্ধৃতি (অতিরিক্ত জোর দিয়ে):

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

~foofooনির্দিষ্টভাবে উল্লিখিত হিসাবে ব্যবহারকারীর হোম ডিরেক্টরিতে প্রসারিত /etc/passwd। দ্রষ্টব্য, এতে সিস্টেমের ব্যবহারকারীর নাম অন্তর্ভুক্ত থাকতে পারে; এটি অগত্যা মানব ব্যবহারকারীদের অর্থ নয় বা তারা আসলে স্থানীয়ভাবে লগ ইন করতে পারে (উদাহরণের জন্য তারা এসএসএইচ কীগুলির মাধ্যমে লগ ইন করতে পারে)।

প্রকৃতপক্ষে, মন্তব্যে উল্লিখিত হিসাবে , ফাংশন bashব্যবহার করবে getpwnam। এই ফাংশনটি নিজেই পসিআইএসএক্স স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট করা হয়েছে , সুতরাং ম্যাকোস এক্স সহ বেশিরভাগ ইউনিক্সের মতো সিস্টেমে উপস্থিত থাকা উচিত । এই ফাংশনটি /etc/passwdকেবল সীমাবদ্ধ নয় এবং অন্যান্য ডেটাবেস যেমন এলডিএপি এবং এনআইএস অনুসন্ধান করে। 394 লাইনে শুরু করে bash উত্স কোড , tilde.cফাইল থেকে বিশেষ অংশ :

  /* No preexpansion hook, or the preexpansion hook failed.  Look in the
     password database. */
  dirname = (char *)NULL;
#if defined (HAVE_GETPWNAM)
  user_entry = getpwnam (username);
#else
  user_entry = 0;

ব্যবহারিক উদাহরণ

নীচে আপনি আমার সিস্টেমে সিস্টেম ব্যবহারকারীর সাথে পরীক্ষা দেখতে পারেন। সম্পর্কিত passwdএন্ট্রি এবং ফলাফল মনোযোগ দিনls ~username

$ grep '_apt' /etc/passwd
_apt:x:104:65534::/nonexistent:/bin/false
$ ls ~_apt
ls: cannot access '/nonexistent': No such file or directory
$ grep '^lp' /etc/passwd
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
$ ls ~lp
ls: cannot access '/var/spool/lpd': No such file or directory

এমনকি যদি উদাহরণস্বরূপ _aptঅ্যাকাউন্ট passwd -S aptএটির আউটপুট দ্বারা প্রস্তাবিত হিসাবে লক করা থাকে তবুও সম্ভাব্য লগইন নাম হিসাবে প্রদর্শিত হচ্ছে:

_apt L 11/29/2017 0 99999 7 -1

দয়া করে নোট করুন: এটি ম্যাকোস নির্দিষ্ট বৈশিষ্ট্য নয়, বরং শেল-নির্দিষ্ট বৈশিষ্ট্য।


আমি সন্দেহ করি যে শেলটি অ্যাকাউন্টের মেয়াদোত্তীর্ণের তারিখ সম্পর্কে কিছু সন্ধানের উপর নির্ভর করতে পারে বা টিল্ডটি প্রসারিত করার সময় এটি লক করা থাকলে বা কিছু থাকলে। যেমন লিনাক্সে, মেয়াদ শেষ হওয়ার তারিখটি /etc/shadowপাসওয়ার্ডের মতো অন্যান্য সুরক্ষিত প্রমাণীকরণ তথ্যের সাথে সঞ্চিত থাকে । এর মধ্যে উল্লেখটি কেবল passwdপাসওয়ার্ডকে অবৈধ করে তুলতে হবে: যা অন্যান্য মাধ্যমে প্রমাণীকরণকে আটকাবে না।
ilkkachu

ইলক্কাছু ইয়েপ, আপনি ঠিক বলেছেন আমি testuserপাসওয়ার্ডের মেয়াদোত্তীকরণের তারিখ যুক্ত ও সংশোধন করে এটি পরীক্ষা করেছি tested ট্যাব সমাপ্তিতে ব্যবহারকারীর নামটি এখনও উপস্থিত রয়েছে। আমি উত্তরটি থেকে কিছুটা সরিয়েছি
সের্গি কলডিয়াজহনি

1
এই উত্তরের একমাত্র সমস্যাটি হ'ল এটি bashম্যান পৃষ্ঠাটি উদ্ধৃত করে (এবং এটিতে পুরানো একটি, এটি মনে হয়)। ওপি আসলে ব্যবহার করছে zsh(আরও পরিষ্কার হতে পারে), যদিও মন্তব্যে এটি উল্লেখ করা হয়েছে যে bashএকই আচরণ করে।
কেন ওয়েইন ভেন্ডারলিন্ডে

2
আপনি শেল হিসাবে একই লক পদ্ধতি অনুসরণ করতে getent passwd fooপরিবর্তে ব্যবহার করতে পারেন grep foo /etc/password- সম্ভবত নেটওয়ার্ক-ভিত্তিক ডিরেক্টরি পরিষেবাগুলি যা অবিগাইল উল্লেখ করেছে including
আরজেহান্টার

1
'যেমন এলডিএপ এবং এনআইএস' বিটের উত্তর হিসাবে গ্রহণ করা হয়েছে, যা আমার ক্ষেত্রে সঠিক হয়ে গেছে!
আরডি

5

আপনি কেন এর জন্য কিছু দেখতে পাচ্ছেন তার সংক্ষিপ্তসারটি ~foo/barহ'ল কারণ আপনার fooসিস্টেমে কোনও ব্যবহারকারীকে barতাদের হোম ডিরেক্টরিতে থাকা ফোল্ডারের সাথে সিস্টেমে নামকরণ করা হয়েছে।

এই সমাধানটিকে অন্য সম্প্রদায়ের মধ্যে দেখুন যা (টিল্ড) ~কেবল "হোম ডিরেক্টরি" এর চেয়ে বেশি কেন তা ব্যাখ্যা করে ।

binআপনার সিস্টেমে যদি আপনার কোনও ব্যবহারকারী নাম লেখা থাকে, তবে আপনি বিনয়ের হোম ডিরেক্টরি ডিরেক্টরিতে কমান্ডটি তালিকাভুক্ত করতে পারেন :

ls ~bin

আরেকটি জিনিস যা আপনি চেষ্টা করতে পারেন তা হল প্রম্পটে নিম্নলিখিতটি টাইপ করার পরে ট্যাব সমাপ্তি ব্যবহার করা (গাড়ী চালাবেন না, কেবল ট্যাব কীটি ব্যবহার করুন):

ls -lah ~ tab

ব্যবহারকারীর হোম ডিরেক্টরিগুলির তালিকা দেখতে যা ~যদি আপনি চালিয়ে যান তবে প্রসারিত হবে। ট্যাব সমাপ্তির উদাহরণ (কাটা) আউটপুটls -lah ~ tab

$ ls -lah ~ [tab]
~antman/            ~games/
~bin/               ~mail/

1
ট্যাব সমাপ্তির জন্য +1। এটি স্পষ্টভাবে সমস্ত ব্যবহারকারীর নাম প্রকাশ করে যা ব্যাশগুলি সম্ভব লগইন নামগুলি থেকে পেতে পারে /etc/passwd। এটি ব্যবহারকারীরা যদি সিস্টেমে থাকা ব্যবহারকারী নামগুলি সম্পর্কে অবগত থাকে তবে তা তাত্ক্ষণিকভাবে তা স্পষ্ট করতে সহায়তা করে।
সের্গেই কোলোডিয়াজনি

2
বাশ সমাপ্তির টিপসটির জন্য ধন্যবাদ - এর ফলে কিছু আকর্ষণীয় স্বতঃপূরণ ফলাফল পাওয়া গেছে। যদিও ~fooস্বয়ংসম্পূর্ণ করেনি, আমি প্রত্যায়ন পারেন যে fooআমার সিস্টেম এ একটি ব্যবহারকারী নন (এবং প্রকৃতপক্ষে বিদ্যমান নেই /etc/passwd)। তদুপরি, /some/mount/pointস্বতঃপূরণে প্রদর্শিত সমস্ত ফোল্ডার / ফাইল যা অত্যন্ত আকর্ষণীয়।
আরডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.