ls কমান্ড প্রাপকের উপর নির্ভর করে ভিন্নভাবে পরিচালিত হয়


12

কমান্ডগুলি কীভাবে lsজানতে পারে যে এটির স্টডআউট কী?

lsলক্ষ্য stdout কি উপর নির্ভর করে এটি পৃথকভাবে কাজ করছে বলে মনে হচ্ছে। উদাহরণস্বরূপ যদি আমি করি:

ls /home/matt/tmp 

ফলাফল হলো:

a.txt b.txt c.txt

তবে আমি যদি করি

ls /home/matt/tmp | cat

ফলাফলটি (প্রতি ফলাফল হিসাবে নতুন লাইন):

a.txt
b.txt
c.txt

প্রক্রিয়াটি stdout ডান জন্য একটি ফাইল বর্ণনাকারী 1 পাস? কীভাবে ফলাফলটি ফর্ম্যাট করবেন তা নির্ধারণ করে? ফাইল বিবরণকারী তথ্য প্রকাশ করে?


সম্পর্কিত unix.stackexchange.com/q/157285/4671 , unix.stackexchange.com/q/63108/4671 এবং সম্ভবত অন্যান্য। এটি একটি জনপ্রিয় বিষয় বলে মনে হচ্ছে। এটি এইগুলির মধ্যে একটির একটি অর্থ হতে পারে।
ফাহিম মিঠা

উত্তর:


22

lsপ্রোগ্রাম ব্যবহার isatty()জানা FD 1 TTY বা অন্য কিছু (নল, ফাইল, ইত্যাদি ...) হয়। থেকে man 3 isatty:

int isatty(int fd);

বর্ণনা ফাংশন পরীক্ষা কিনা একটি খোলা ফাইল বর্ণনাকারী একটি টার্মিনাল উল্লেখ করা হয়
isatty()fd


আপডেটেড: কোরিউটিলসls.c থেকে 1538 লাইন (গিট রিভিশন 43a987e1):

  if (isatty (STDOUT_FILENO))
    {
      format = many_per_line;
      /* See description of qmark_funny_chars, above.  */
      qmark_funny_chars = true;
    }

( many_per_lineস্ব-বর্ণনামূলক হওয়া উচিত))


8

একটি সঠিক উত্তর নয় একটি উদাহরণ। বাশ স্ক্রিপ্টে আপনি test/ [[এর এর সাথে একই প্রভাব অর্জন করতে পারেন -t:

-t FD True if FD is opened on a terminal.

এটি এটির মতো ব্যবহার করে:

bash-4.2$ where() { [[ -t 1 ]] && echo 'my output goes to TTY' || echo 'my output is redirected'; }

bash-4.2$ where
my output goes to TTY

bash-4.2$ where | cat
my output is redirected

bash-4.2$ where > test.file
bash-4.2$ cat test.file
my output is redirected

6

ওপেনবিএসডি ls(1) ম্যানুয়াল থেকে :

ডিফল্টরূপে, ls স্ট্যান্ডার্ড আউটপুটে প্রতি লাইনটিতে একটি প্রবেশ তালিকা তালিকাভুক্ত করে; ব্যতিক্রমগুলি টার্মিনালগুলিতে বা যখন -C, -m, বা -x বিকল্পগুলি নির্দিষ্ট করা থাকে।

তাহলে পরে:

-1 (সংখ্যার অঙ্ক `` এক ''।) আউটপুটকে প্রতি লাইনে একটি করে প্রবেশ করতে বাধ্য করুন। টার্মিনালে আউটপুট না এলে এটি ডিফল্ট হয়।

[...]

-সি ফোর্স বহু-কলাম আউটপুট; টার্মিনালে আউটপুট এলে এটি ডিফল্ট হয়।


1

আপনি কমান্ডটি lsব্যবহার করে সিউডো-টার্মিনালে এক্সিকিউট করতে পারেন script, আউটপুটটিকে lsঅন্য কোনও কমান্ডে পাইপ করতে পারেন এবং একই আউটপুট ফর্ম্যাটটি পেতে পারেন যেন স্টাডআউট স্ট্রিমের পাইপিং নেই, যেমন স্ট্যাডআউট একটি টার্মিনাল (tty) ছিল।

অন্তর্নিহিত isatty()প্রক্রিয়াটির জন্য ইতিমধ্যে স্টাফেন গিমেনেজ নির্দেশ করেছেন ls.c দেখুন

ls -G /
ls -G / | cat
script -q /dev/null ls -G / | sed $'s/\r$//g' | cat

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