কেন xargs এপটি-গর্ভপাত বন্ধ করতে দেয়?


17

আমি একটি ফাইল থেকে প্যাকেজগুলির একটি তালিকা সরানোর চেষ্টা করছি। আমি নিম্নলিখিত কমান্ডটি ব্যবহার করছি:

cat packages | xargs sudo apt-get remove

packagesআমার ফাইলটি হ'ল প্যাকেজগুলির একটি তালিকা রয়েছে যা আমি মুছে ফেলতে চাই। সবকিছুই কাজ করে বলে মনে হচ্ছে তবে apt-getআমাকে হ্যাঁ বা না বেছে নেওয়ার পরিবর্তে এ্যাবসর্স করে।

আমি জানি আমি -yবিকল্পটির সাথে এটি পেতে পারি তবে আমি কেন এটি হচ্ছে তা এবং আমি কীভাবে ইন্টারেক্টিভ পছন্দটি রাখতে পারি তা জানতে চাই।


এটি কীভাবে "ভালভাবে কাজ করে" যখন মনে হয় এটি আদৌ কাজ করে না? আপনার ফাইল এন্ট্রি দেখতে কেমন? আপনি চেষ্টা করেছেন sudo xargs --arg-file packages apt-get remove?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

ঠিক আছে, এটি "কাজ করে" ধরণের কারণ সঠিক প্যাকেজগুলি অপসারণের জন্য উপযুক্ত স্থানটি পেয়ে যায়। এটি বলেছিল, --আরগ-ফাইলটি আমি যা খুঁজছিলাম। আপনি এটি একটি উত্তরে রাখতে পারেন এবং আমি এটি গ্রহণ করব। ধন্যবাদ!
subb

উত্তর:


13
xargs -a packages sudo apt-get remove

xargsথেকে packagesতর্কগুলি পড়তে সরাসরি নির্দেশ দেবে এবং সুতরাং এটি স্টিডিনকে নিরবচ্ছিন্ন ছেড়ে দেবে।


10

আরও সাধারণ সমাধান হবে

 sudo apt-get remove `cat packages`

প্যাকেজগুলির তালিকাটি যদি সত্যিই দীর্ঘ হয় তবে আপনার কোনও সমস্যা হবে ।

এটি কাজ না করার কারণটি হ'ল অ্যাপটি-পাইপ স্ট্যান্ডার্ড ইনপুট থেকে আপনার নিশ্চিতকরণটি পড়ার চেষ্টা করছে যা - পাইপের কারণে - সংযুক্ত রয়েছে cat। বিপরীতে, sudoসরাসরি / dev / tty খোলার মাধ্যমে আপনার পাসওয়ার্ড জিজ্ঞাসা করে সঠিক কাজ করে। অ্যাপ্টের এটি করা উচিত তবে দৃশ্যত তা করেন না।


Xargs এর স্ট্যান্ডার্ড ইনপুটটি পাইপের সাথে সংযুক্ত cat , তবে xargs দ্বারা শুরু হওয়া প্রক্রিয়াটির / dev / নাল থেকে আসা স্ট্যান্ডার্ড ইনপুট রয়েছে। এটিই জার্গজের আচরণ। সরল বিক্ষোভ:echo "" | xargs ls -l /dev/self/fd
জুলিয়ানো

1
@ এমবিউজ: না, apt-getখোলা উচিত নয় /dev/tty। অন্যথায় আপনি ভালো জিনিস করতে পারবেন না yes | apt-get। পাসওয়ার্ডগুলি /dev/ttyহ'ল একমাত্র ক্ষেত্রে যেখানে থেকে পড়া সঠিক জিনিস এবং এমনকি এটি বিতর্কযোগ্য।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

মন্তব্যের জন্য ধন্যবাদ, উভয়ই আমার থাপ্পড়-ড্যাশ প্রতিক্রিয়ার চেয়ে সঠিক এবং ভাল চিন্তাভাবনা, যা আমি অন-সম্পাদিত রেখে যাচ্ছি যাতে মন্তব্যগুলি এখনও বোঝা যায়।
এমএসডব্লু

আমি দেখি. এই এবং xargs -a ফাইলনামের মধ্যে কোনও পার্থক্য রয়েছে, যেমন মহামান্য পরামর্শ দিচ্ছে?
subb

হ্যাঁ, --arg-fileনির্দিষ্ট ক্ষেত্রে ক্ষেত্রে এফাইমিয়েন্টের বিকল্পটির ব্যবহার আরও ভাল, এজন্যই আমি এটিকে অগ্রাহ্য করেছি। এমন অনেক কমান্ডের জন্য যেমন বিকল্প নেই, ব্যাকটিক-বিড়ালের রূপকটির এখনও ব্যবহার রয়েছে।
এমএসডব্লু

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 আর্গুমেন্ট ও প্রক্রিয়া উদ্ধৃতি (একটি ফাঁকা পৃথক করা তালিকা আশা করছে ", 'এবং \,) যখন $(...)না প্রক্রিয়া কোট এবং নিদর্শন globbing বিস্তৃতি করে), তবে আপনাকে কাজ করতে পারে:

sudo apt-get remove $(cat packages)

তবে দয়া করে নোট করুন যে অনেক অপারেটিং সিস্টেমের কমান্ড লাইনের দৈর্ঘ্যের একটি সীমা রয়েছে, সুতরাং তালিকাটি বড় হলে এটি কাজ করতে পারে না (যখন xargsবেশ কয়েকটি apt-getকমান্ড চালিয়ে ইস্যুটি নিয়ে কাজ করবে )।


0

আমি ভুল হতে পারি তবে আপনি এটি ব্যবহার করে দেখতে পারেন এবং এটি কার্যকর হয় কিনা:

yes | sudo apt-get remove $(cat packages)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.