ls कमांड प्राप्तकर्ता के आधार पर अलग तरीके से काम करता है


12

कमांड्स को कैसे lsपता चलता है कि उसका स्टडआउट क्या है?

ऐसा लगता lsहै कि लक्ष्य स्टडआउट क्या है, इसके आधार पर अलग-अलग चल रहा है। उदाहरण के लिए अगर मैं करता हूं:

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


अपडेटेड: कोर्यूटिल्स से लाइन 1538 ls.c(git revision 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

OpenBSD ls(1) मैनुअल से :

डिफ़ॉल्ट रूप से, ls मानक उत्पादन में प्रति पंक्ति एक प्रविष्टि सूचीबद्ध करता है; अपवाद टर्मिनलों के लिए या जब -C, -m, या -x विकल्प निर्दिष्ट किए जाते हैं।

फिर बाद में:

-1 (संख्यात्मक अंक `` एक '') प्रति पंक्ति एक प्रविष्टि होने के लिए बल आउटपुट। यह तब डिफ़ॉल्ट होता है जब आउटपुट टर्मिनल पर नहीं होता है।

[...]

-सी फोर्स मल्टी-कॉलम आउटपुट; जब टर्मिनल में आउटपुट होता है तो यह डिफ़ॉल्ट होता है।


1

आप कमांड lsका उपयोग करके छद्म टर्मिनल में निष्पादित कर सकते हैं script, lsदूसरे कमांड के आउटपुट को पाइप कर सकते हैं और आउटपुट आउटपुट स्वरूप प्राप्त कर सकते हैं जैसे कि स्टडआउट स्ट्रीम का ऐसा कोई पाइपिंग नहीं था, जैसे कि स्टैडआउट एक टर्मिनल (ट्टी) था।

अंतर्निहित isatty()तंत्र के लिए पहले से ही स्टीफन जिमेनेज़ ने एलसीसी देखें ।

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

# tty | cat
# script -q /dev/null tty | cat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.