Apt-cache पॉलिसी आउटपुट पाइप क्यों नहीं है?


12

क्यों नहीं मिल सकता

$ apt-cache policy foo
N: Unable to locate package foo

परंतु

$ apt-cache policy foo 2>&1 | grep .

खाली है।

बाद के कॉल में मैं गलत धारणा कहाँ कर रहा हूँ?

मूल कार्य: मुझे apt-cache policyउत्पादन की प्रक्रिया संभवतः करने की आवश्यकता है :-)

UPD :

fooमेरे उदाहरण में प्रयुक्त किसी भी पैकेज के नाम के साथ प्रतिस्थापित किया जा सकता है जो आपके apt-getसूचकांक में मौजूद नहीं है

UPD 2 :

वर्कअराउंड के साथ उत्तर है। अतिरिक्त +50इनाम किसी को भी दिया जाएगा जो बताता है कि 2>&1समाधान क्यों काम नहीं करता है।


# apt-cache policy vim 2>&1 |grep . vim: Installed: 2:7.4.712-2 Candidate: 2:7.4.712-2 Version table: *** 2:7.4.712-2 0 500 http://ftp.debian.org/debian/ sid/main amd64 Packages 100 /var/lib/dpkg/status
फ़ारसीगुल्फ़

1
@MohsenPahlevanzadeh यह सही है, अब सटीक कॉल का प्रयास करें (पैकेज नाम) मैंने प्रदान किया :-)
zerkms

3
@MohsenPahlevanzadeh तो? मुझे क्षमा करें, लेकिन क्या आप सुनिश्चित हैं कि आपने प्रश्न (और शीर्षक) पढ़ा है?
झटके ६'१५

2
@MohsenPahlevanzadeh नहीं के बराबर नहीं है (करीब भी नहीं)
zerkms

1
मैं चलाता हूं strace apt-cache policy foo 2>&1और एक सिस्टम कॉल है जो ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0मुझे लगता है कि इस कॉल के कारण 1 (stdout) में समस्याएं हैं। मेरा मतलब है कि यह अब तक नहीं लिखा गया है
Esref

जवाबों:


11

यदि स्टडआउट कोई टैटी नहीं है (यानी यह एक नियमित फ़ाइल या पाइप है) और यदि कोई --quietविकल्प निर्दिष्ट नहीं किया गया है, apt-cacheतो ऐसा लगता है कि आपने इसे पारित कर दिया है --quiet=1। वर्कअराउंड इसे एक --quiet=0विकल्प पास करना है ।

$ apt-cache --quiet=0 policy foo 2>&1 | grep .
N: Unable to locate package foo


10

पुनर्निर्देशन के लिए कुछ ढोंगी व्यवहार प्रतीत होता है apt-cache। लेकिन हम stdout और stderr को स्वैप करके एक चीटर को धोखा दे सकते हैं !

यह कोशिश करो, यह काम करना चाहिए:

apt-cache policy foo 3>&1 1>&2 2>&3 3>&- | grep .

7

यदि आप strace apt-cache policy foo 2>&1कमांड चलाते हैं , तो आप लाइन देख सकते हैंioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

क्योंकि वह कमांड 1 (stdout) में हेरफेर करता है, 1 अब stdout को नहीं लिखा जाता है। और यदि आप 2 से 1 को पुनर्निर्देशित करते हैं, तो आप दोनों को खो देते हैं।

संपादित करें: यहां apt-cache स्रोत कोड से कुछ कोड नमूना है:

// Deal with stdout not being a tty
   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
      _config->Set("quiet","1");

ठीक है। उन दोनों को पकड़ने का कोई तरीका?
'23:

1
मुझे @ Mr_Mig के उत्तर के अलावा कोई अन्य तरीका नहीं मिला। (मेरा था apt-cache policy foo 1>&2 2>&1 | grep .) लेकिन मुझे लगता है कि स्रोत कोड में उपयुक्त apt-cache :) // stdout के साथ सौदा एक tty नहीं होने पर (अगर isatty (STDOUT_FILENO)) && _config-> FindI ("शांत", -1) == 1) _config-> सेट ("शांत", "1");
एस्फ़ी

Btw, मैं भी कुछ ही मिनटों पहले सूत्रों में एक ही बिंदु के लिए किसी के द्वारा कहा गया था :-) और एक संभावित बेहतर समाधान script -c "sudo apt-cache policy foo" | grep Unableजो एक scriptहालांकि स्थापित करने की आवश्यकता है । जैसा कि सलाह दी गई है - मैं 2 दिनों में यहां +50 डालूंगा (एसई पहले ऐसा करने की इजाजत नहीं देता)
zerkms

2
@Esref "मुझे लगता है कि स्रोत कोड में उपयुक्त apt-cache ..." के बारे में आपकी टिप्पणी उत्तर में होनी चाहिए, इसलिए कृपया इसे वहां जोड़ें। +1। :
फहीम मीठा

हे भगवान, अब कोई +50 इनाम विकल्प नहीं है :-(
zerkms

3

scriptउपयोगिता का उपयोग करने के लिए एक "बेहतर" समाधान होगा :

script -c "apt-cache policy foo" /dev/null | grep .

इस तरह यह सभी आउटपुट को स्वीकार करता है और इसे आगे करता है stdout

एकमात्र दोष यह है कि आपको इसे स्थापित करने की आवश्यकता है scriptयदि आपके पास अभी तक नहीं है। Ubunty में यह bsdutilsपैकेज द्वारा प्रदान किया गया है।

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