Xargs को गर्भपात के लिए उपयुक्त क्यों माना जाता है?


17

मैं एक फ़ाइल से संकुल की सूची निकालने की कोशिश कर रहा हूँ। मैं निम्नलिखित कमांड का उपयोग कर रहा हूं:

cat packages | xargs sudo apt-get remove

packagesमेरी फ़ाइल में उन पैकेजों की एक सूची है, जिन्हें मैं हटाना चाहता हूँ। सब कुछ काम करता दिखाई देता है, लेकिन apt-getमुझे हाँ या ना चुनने की बजाय गर्भपात कराती है।

मुझे पता है कि मैं इस -yविकल्प के साथ इसे प्राप्त कर सकता हूं , लेकिन मैं जानना चाहूंगा कि ऐसा क्यों हो रहा है और मैं इंटरैक्टिव विकल्प कैसे रख सकता हूं।


जब यह काम करता है तो यह "अच्छी तरह से" कैसे काम करता है? आपकी फ़ाइल में एक प्रविष्टि कैसी दिखती है? क्या आपने कोशिश की है sudo xargs --arg-file packages apt-get remove?
अगली सूचना तक रोक दिया गया।

खैर, यह "काम करता है" क्योंकि सही-सही पैकेज को हटाने के बिंदु पर मिलता है। उस ने कहा, --arg-file वही थी जो मैं ढूंढ रहा था। आप एक उत्तर में रख सकते हैं और मैं इसे स्वीकार करूंगा। धन्यवाद!
सबब

जवाबों:


13
xargs -a packages sudo apt-get remove

निर्देशित करेंगे xargsसे दलीलें पढ़ने के लिएpackages , और इसलिए यह बिना सोचे-समझे छोड़ देगा।


10

एक अधिक सामान्य समाधान होगा

 sudo apt-get remove `cat packages`

यदि पैकेज की सूची वास्तव में लंबी है तो आपको एक समस्या होगी ।

यह काम नहीं कर रहा है इसका कारण यह है कि apt-get मानक इनपुट से आपकी पुष्टि को पढ़ने की कोशिश कर रहा है - जो कि पाइप के कारण - से जुड़ा हुआ है cat। Contrariwise, sudoसीधे / देव / tty खोलकर अपना पासवर्ड पूछकर राइट थिंग करता है। Apt को ऐसा करना चाहिए लेकिन जाहिर तौर पर ऐसा नहीं है।


Xargs का मानक इनपुट पाइप से जुड़ा हुआ है cat, लेकिन xargs द्वारा शुरू की गई प्रक्रिया में इसका मानक इनपुट / dev / null से आ रहा है। यह xargs का व्यवहार है। सरल प्रदर्शन:echo "" | xargs ls -l /dev/self/fd
जूलियानो

1
@ मेव्स: नहीं, apt-getनहीं खोलना चाहिए /dev/tty। अन्यथा आप ऐसा नहीं कर सकते yes | apt-get। पासवर्ड बहुत ही एकमात्र मामला है जहां से पढ़ना /dev/ttyसही बात है, और यहां तक ​​कि बहुत बहस का विषय है।
गाइल्स 'एसओ- बुराई को रोकना'

टिप्पणियों के लिए धन्यवाद, दोनों मेरे थप्पड़-डैश प्रतिक्रिया की तुलना में सही और बेहतर हैं, जिसे मैं अन-एडिट छोड़ने जा रहा हूं ताकि टिप्पणियां अभी भी समझ में आए।
msw

समझा। क्या इस और xargs -a फ़ाइल नाम के बीच कोई अंतर है, जैसे कि ephemient सुझाव दे रहा है?
सबब

हां, एफिफेमिएंट --arg-fileविकल्प का उपयोग विशिष्ट मामले के लिए और भी बेहतर है, यही वजह है कि मैंने इसे उकेरा है। ऐसे कई आदेशों के लिए, जिनके पास ऐसा विकल्प नहीं है, बैकटिक-कैट रूपक अभी भी इसके उपयोग करता है।
14

2

क्योंकि apt-getएक से अधिक पैकेज निकाल रहा है, और इसलिए कार्रवाई की पुष्टि करनी चाहिए। चूंकि यह STDINएक पाइप से पढ़ रहा है और टर्मिनल से जुड़ा नहीं है, यह ऑटो मानता है No

एक अन्य तरीका यह चारों ओर पाने के लिए जोड़ने के लिए है APT::Get::Assume-Yesकरने के लिए apt.conf


2

जाहिरा तौर पर xargs STDIN को पुनर्निर्देशित करता है जो इस बात को गलत मानता है कि यह गैर-संवादात्मक मोड में चल रहा है।

मैं शायद कुछ इस तरह का उपयोग करेगा

sudo apt-get remove $(cat packages)

xargs का उपयोग करने से बचें।

("--arg-file" न तो उपयुक्त-प्राप्त व्यक्ति में है (8) आदमी में और न ही मेरी सक्रिय शब्दावली में)।


1

चारों ओर काम करने के लिए।

GNU xargs और ksh / zsh / bash के साथ:

sudo xargs -r --arg-file <(cat packages) apt-get remove

(बेशक, अगर कमांड सिर्फ है cat, तो आप के <(cat packages)साथ बदल सकते हैं packages

या:

< packages sudo xargs sh -c 'exec apt-get remove "$@" < /dev/tty' sh

"पैकेज" फ़ाइल के स्वरूप पर निर्भर करता है (xargs तर्क और प्रक्रियाओं उद्धरण (के एक खाली अलग की गई सूची उम्मीद कर रही है ", 'और \,), जबकि $(...)नहीं प्रक्रिया उद्धरण और पैटर्न ग्लोबिंग फैलता करता है), तो आप भी कर सकता है:

sudo apt-get remove $(cat packages)

लेकिन कृपया ध्यान दें कि कई ऑपरेटिंग सिस्टम में कमांड लाइन की लंबाई की सीमा होती है, ताकि सूची बड़ी होने पर काम न करें (जबकि xargsकई apt-getकमांड चलाकर समस्या के आसपास काम करेंगे )।


0

मैं गलत हो सकता हूं, लेकिन आप यह कोशिश कर सकते हैं और देखें कि क्या यह काम करता है:

yes | sudo apt-get remove $(cat packages)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.