Mengapa xarg menyebabkan apt-get untuk dibatalkan?


17

Saya mencoba menghapus daftar paket dari file. Saya menggunakan perintah berikut:

cat packages | xargs sudo apt-get remove

packagesadalah file saya yang berisi daftar paket yang ingin saya hapus. Semuanya tampak berfungsi, tetapi apt-getbatal alih-alih membiarkan saya memilih ya atau tidak.

Saya tahu saya bisa menyiasati ini dengan -yopsi, tapi saya ingin tahu mengapa ini terjadi dan bagaimana saya bisa menjaga pilihan interaktif.


Bagaimana cara "bekerja dengan baik" ketika kedengarannya tidak berfungsi sama sekali? Seperti apa entri dalam file Anda? Sudahkah Anda mencoba sudo xargs --arg-file packages apt-get remove?
Dijeda sampai pemberitahuan lebih lanjut.

Yah, itu semacam "berfungsi" karena apt-get sampai pada titik menghapus paket yang tepat. Yang mengatakan, --arg-file adalah apa yang saya cari. Anda dapat memasukkannya ke dalam jawaban dan saya akan menerimanya. Terima kasih!
subb

Jawaban:


13
xargs -a packages sudo apt-get remove

akan mengarahkan xargsuntuk membaca argumen dari packages, dan itu akan meninggalkan stdin tanpa gangguan.


10

Solusi yang lebih umum adalah

 sudo apt-get remove `cat packages`

di mana Anda akan memiliki masalah jika daftar paket sangat panjang .

Alasan mengapa itu tidak berfungsi adalah bahwa apt-get sedang mencoba untuk membaca konfirmasi Anda dari input standar yang - karena pipa - dilampirkan cat. Sebaliknya, sudolakukan Hal yang Benar dengan menanyakan kata sandi Anda dengan membuka / dev / tty secara langsung. Apt harus melakukan ini tetapi ternyata tidak.


Input standar xarg terhubung ke pipa dari cat, tetapi proses yang dimulai oleh xarg memiliki input standar yang berasal dari / dev / null. Ini adalah perilaku xargs. Peragaan sederhana:echo "" | xargs ls -l /dev/self/fd
Juliano

1
@ mws: Tidak, apt-gettidak boleh terbuka /dev/tty. Kalau tidak, Anda tidak bisa melakukan hal-hal seperti yes | apt-get. Kata sandi cukup banyak satu-satunya kasus di mana membaca dari /dev/ttyadalah hal yang benar, dan bahkan banyak yang bisa diperdebatkan.
Gilles 'SO- stop being evil'

Terima kasih atas komentarnya, keduanya benar dan lebih baik daripada respons slap-dash saya, yang akan saya tinggalkan tidak diedit sehingga komentarnya tetap masuk akal.
msw

Saya melihat. Apakah ada perbedaan antara ini dan xargs -a nama file, seperti yang disarankan ephemient?
subb

Ya, penggunaan --arg-fileopsi oleh ephimemient bahkan lebih baik untuk kasus tertentu yang mengapa saya memutarnya. Untuk banyak perintah yang tidak memiliki opsi seperti itu, metafora backtick-cat masih memiliki kegunaannya.
msw

2

Karena apt-getmenghapus lebih dari satu paket, dan karenanya harus mengkonfirmasi tindakan. Karena itu membaca STDINdari pipa dan tidak terhubung ke terminal itu otomatis diasumsikan No.

Cara lain untuk mendapatkan sekitar ini adalah untuk menambahkan APT::Get::Assume-Yeske apt.conf.


2

Rupanya xargs mengarahkan ulang STDIN yang membingungkan apt-get untuk menganggap bahwa itu berjalan dalam mode non-interaktif.

Saya mungkin akan menggunakan sesuatu seperti

sudo apt-get remove $(cat packages)

untuk menghindari penggunaan xargs sama sekali.

("--arg-file" bukan dalam apt-get (8) man maupun dalam kosakata aktif saya).


1

Untuk mengatasinya.

Dengan GNU xargs dan ksh / zsh / bash:

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

(tentu saja, jika perintahnya adil cat, maka Anda dapat menggantinya <(cat packages)dengan packages.

Atau:

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

Bergantung pada format file "paket" (xargs mengharapkan daftar argumen dan proses kutipan yang dipisahkan secara kosong ( ", 'dan \), sementara $(...)tidak memproses tanda kutip dan memperluas pola globbing), Anda juga dapat melakukan:

sudo apt-get remove $(cat packages)

Tetapi harap dicatat bahwa banyak sistem operasi memiliki batas pada panjang baris perintah, sehingga mungkin tidak berfungsi jika daftar besar (sementara xargsakan mengatasi masalah dengan menjalankan beberapa apt-getperintah).


0

Saya mungkin salah, tetapi Anda dapat mencoba ini dan melihat apakah itu berhasil:

yes | sudo apt-get remove $(cat packages)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.