Saya mencoba menghapus daftar paket dari file. Saya menggunakan perintah berikut:
cat packages | xargs sudo apt-get remove
packages
adalah file saya yang berisi daftar paket yang ingin saya hapus. Semuanya tampak berfungsi, tetapi apt-get
batal alih-alih membiarkan saya memilih ya atau tidak.
Saya tahu saya bisa menyiasati ini dengan -y
opsi, tapi saya ingin tahu mengapa ini terjadi dan bagaimana saya bisa menjaga pilihan interaktif.
sudo xargs --arg-file packages apt-get remove
?Jawaban:
akan mengarahkan
xargs
untuk membaca argumen daripackages
, dan itu akan meninggalkan stdin tanpa gangguan.sumber
Solusi yang lebih umum adalah
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,sudo
lakukan Hal yang Benar dengan menanyakan kata sandi Anda dengan membuka / dev / tty secara langsung. Apt harus melakukan ini tetapi ternyata tidak.sumber
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
apt-get
tidak boleh terbuka/dev/tty
. Kalau tidak, Anda tidak bisa melakukan hal-hal sepertiyes | apt-get
. Kata sandi cukup banyak satu-satunya kasus di mana membaca dari/dev/tty
adalah hal yang benar, dan bahkan banyak yang bisa diperdebatkan.--arg-file
opsi 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.Karena
apt-get
menghapus lebih dari satu paket, dan karenanya harus mengkonfirmasi tindakan. Karena itu membacaSTDIN
dari pipa dan tidak terhubung ke terminal itu otomatis diasumsikanNo
.Cara lain untuk mendapatkan sekitar ini adalah untuk menambahkan
APT::Get::Assume-Yes
keapt.conf
.sumber
Rupanya xargs mengarahkan ulang STDIN yang membingungkan apt-get untuk menganggap bahwa itu berjalan dalam mode non-interaktif.
Saya mungkin akan menggunakan sesuatu seperti
untuk menghindari penggunaan xargs sama sekali.
("--arg-file" bukan dalam apt-get (8) man maupun dalam kosakata aktif saya).
sumber
Untuk mengatasinya.
Dengan GNU xargs dan ksh / zsh / bash:
(tentu saja, jika perintahnya adil
cat
, maka Anda dapat menggantinya<(cat packages)
denganpackages
.Atau:
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:Tetapi harap dicatat bahwa banyak sistem operasi memiliki batas pada panjang baris perintah, sehingga mungkin tidak berfungsi jika daftar besar (sementara
xargs
akan mengatasi masalah dengan menjalankan beberapaapt-get
perintah).sumber
Saya mungkin salah, tetapi Anda dapat mencoba ini dan melihat apakah itu berhasil:
sumber