কীভাবে এলএস-এল এর আউটপুটটি এত সুন্দরভাবে ফর্ম্যাট করে?


উত্তর:


34

উত্স কোডটি জিএনইউ সাবানাতেls অনলাইন ব্রাউজ করার জন্য উপলব্ধ । বেশিরভাগ ক্ষেত্রে, প্রয়োজনীয় সর্বাধিক প্রস্থটি গণনা করা হয় (উদাহরণস্বরূপ, পাঠ্যের জন্য ফাংশনটি ব্যবহার করে ) এবং তারপরে ক্লাসিক সি ফাংশন ফর্ম্যাট স্পেসিফায়ার এবং কিছু ম্যানুয়াল প্যাডিং ব্যবহার করে। উদাহরণস্বরূপ, কার্যাদি এবং দেখুন ।mbswidthprintfformat_user_or_group()gobble_file()

টি এল; ডিআর: কোনও "ম্যাজিক" নেই, কেবল প্রচুর ক্ষীণ গণনা।


আপনি যদি নিজের আউটপুটের জন্য এমন ঝরঝরে টেবিলগুলি চান তবে ব্যবহার করুন column:

$ grep -vE '^#' /etc/fstab
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2 /               ext4    errors=remount-ro 0       1
/dev/mapper/lvmg-homelvm /home           btrfs   defaults,compress=lzo,space_cache,relatime 0       2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd" none    swap sw 0 0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a" /home/muru/arch     btrfs defaults,compress=lzo,space_cache,relatime 0       2

$ grep -vE '^#' /etc/fstab | column -t
UUID=cdff3742-9d03-4bc1-93e3-ae50708474f2    /                ext4   errors=remount-ro                           0  1
/dev/mapper/lvmg-homelvm                     /home            btrfs  defaults,compress=lzo,space_cache,relatime  0  2
UUID="bb76cd0d-ae1d-4490-85da-1560c32679cd"  none             swap   sw                                          0  0
UUID="a264b1b1-cf82-40aa-ab9e-a810cfba169a"  /home/muru/arch  btrfs  defaults,compress=lzo,space_cache,relatime  0  2

4
আপনি উদাহরণস্বরূপ / etc / fstab ব্যবহার করেছেন তা প্রদত্ত, আমি সাহায্য করতে পারছি না তবে প্রস্তাব দিতে পারি findmnt --fstabUtil-লিনাক্স প্যাকেজ এমনকি একটি লাইব্রেরি "libsmartcols" (পূর্বে libtt) যার ফলে এটি findmnt, lsblk ইত্যাদি ব্যবহার একটি প্রান্তিককৃত টেবিল প্রিন্ট করতে দিয়ে আসে।
মাধ্যাকর্ষণ

পছন্দ করুন আমি আগে ব্যবহার করেছি findmnt, কিন্তু আমি বুঝতে পারি নি যে এটি এটিও করতে পারে।
মুড়ু

/bin/lsএটাও জেনে রাখা ভাল: উবুন্টুতে / ডিবিয়ান প্যাকেজের (জিএনইউ) অংশ coreutils। আপনি এটি চালিয়ে খুঁজে পেতে পারেন dpkg-query -S /bin/ls। প্যাকেজের নামটি জানার পরে, আপনি যে কোনও উবুন্টু প্যাকেজটির সঠিক উত্স কোডটি ডাউনলোড করতে পারেন যা থেকে বাইনারি তৈরি করা হয়েছে (এটি গুরুত্বপূর্ণ) ব্যবহার করেapt-get source <package_name>
এরিয়েল

17

@ মুরুর উত্তর ছাড়াও , এখানে উত্স কোডের একটি অংশ রয়েছে যা widthআউটপুটটির সঠিক বিচার্যতার জন্য গণনা করে । :

static void
format_user_or_group (char const *name, unsigned long int id, int width)
{
  size_t len;

  if (name)
    {
      int width_gap = width - mbswidth (name, 0);
      int pad = MAX (0, width_gap);
      fputs (name, stdout);
      len = strlen (name) + pad;

      do
        putchar (' ');
      while (pad--);
    }
  else
    {
      printf ("%*lu ", width, id);
      len = width;
    }

  dired_pos += len + 1;
}

এটি ব্যবহার করে printf ("%*lu ", width, id);,। দ্রষ্টব্য: পরিবর্তনশীল ক্ষেত্রের প্রস্থ নির্দিষ্টকরণকারী '*'

ls -lএক্ষেত্রে এটি নির্ধারণ করা যায় না যে মৃত্যুদন্ড কার্যকর করার সময় ক্ষেত্রের প্রস্থটি আমাদের কত বড় প্রয়োজন , অর্থাত্ ডিরেক্টরিগুলির নাম দৈর্ঘ্যে পৃথক হতে পারে। এটি সূচিত করে যে ক্ষেত্রের প্রস্থ নিজেই একটি পরিবর্তনশীল হওয়া দরকার , যার জন্য প্রোগ্রামটি একটি মান গণনা করবে

সি ব্যবহার করে একটি প্রিন্টফকে নির্দেশ করতে ক্ষেত্রের প্রস্থ নির্দিষ্টকরণকারীর অবস্থানে নক্ষত্রের করে যা এটি অতিরিক্ত পরামিতি হিসাবে ক্ষেত্রের প্রস্থের মান ধারণ করে এমন ভেরিয়েবলটি খুঁজে পাবে।

উদাহরণস্বরূপ, ধরুন যে প্রস্থের বর্তমান মান 5। বিবৃতি:

printf ("%*d%*d\n", width, 10, width, 11);

মুদ্রণ করবে: (ব্যবধান নোট করুন)

   10   11

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