Xargs neden apt-get'in iptal edilmesine neden oluyor?


17

Bir dosyadan paket listesini kaldırmaya çalışıyorum. Aşağıdaki komutu kullanıyorum:

cat packages | xargs sudo apt-get remove

packageskaldırmak istediğim paketlerin listesini içeren dosyam. Her şey çalışıyor gibi görünüyor, ama apt-getevet ya da hayır seçmeme izin vermek yerine iptal ediliyor .

Bu seçenekle bunun üstesinden gelebileceğimi biliyorum -y, ancak bunun neden olduğunu ve etkileşimli seçimi nasıl koruyabileceğimi bilmek istiyorum.


Hiç çalışmıyormuş gibi göründüğünde nasıl "iyi çalışır"? Dosyanızdaki bir giriş neye benziyor? Denedin sudo xargs --arg-file packages apt-get removemi
— sonraki duyuruya kadar duraklatıldı.

Peki, bu bir tür "çalışır" çünkü apt-get doğru paketleri kaldırma noktasına ulaşır. Dedi ki, --arg dosyası aradığım şeydi. Bunu bir cevaba yazabilirsin ve kabul edeceğim. Teşekkürler!
— subb

Yanıtlar:


13
xargs -a packages sudo apt-get remove

xargsargümanları okumaya yönlendirecek packagesve böylece stdin'i zarar görmeyecektir.


10

Daha genel bir çözüm

 sudo apt-get remove `cat packages`

Paketlerin listesi gerçekten uzunsa sorun yaşarsınız .

Çalışmamasının nedeni, apt-get'in, - borudan dolayı - bağlı olduğu standart girişten onayınızı okumaya çalışmasıdır cat. Aksine, sudo/ Dev / tty'yi doğrudan açarak şifrenizi sorarak Doğru Şey'i yapar. Apt bunu yapmalı ama görünüşe göre değil.


Xargs'ın standart girişi boruya bağlanır cat, ancak xargs tarafından başlatılan işlemin standart girişi / dev / null'dan gelir. Bu xargs davranışıdır. Basit gösteri:echo "" | xargs ls -l /dev/self/fd
— Juliano

1
@mws: Hayır, apt-getaçılmamalı /dev/tty. Aksi takdirde böyle şeyler yapamazsınız yes | apt-get. Parolalar hemen hemen okumanın /dev/ttydoğru şey olduğu tek şeydir ve bu kadarı bile tartışmalıdır.
— Gilles 'SO- kötü olmayı bırak'

Yorumlar için teşekkürler, her ikisi de tokatlı çizgi yanıtımdan daha doğru ve daha iyi düşünülmüş, bu yüzden yorumların hala anlamlı olması için düzenlenmemiş bırakacağım.
— msw

Anlıyorum. Bu ve xargs -a dosya adı arasında, ephemient'in önerdiği gibi bir fark var mı?
— subb

Evet, ephimemient'in --arg-fileseçeneği kullanması , özel durum için daha da iyidir, bu yüzden onu iptal ettim. Böyle bir seçeneği olmayan birçok komut için backtick-cat metaforunun hala kullanımları vardır.
— msw

2

Çünkü apt-getbirden fazla paket kaldırılıyor ve bu nedenle eylemi onaylamak gerekiyor. STDINBir borudan okuduğu ve terminale bağlı olmadığı için otomatik olarak varsayılır No.

Bunu çözmek için başka bir yol eklemektir APT::Get::Assume-Yesiçin apt.conf.


2

Görünüşe göre xargs, interaktif olmayan modda çalıştığını varsaymak için apt-get komutunu karıştıran STDIN'i yönlendiriyor.

Muhtemelen şöyle bir şey kullanırdım

sudo apt-get remove $(cat packages)

xargs kullanmaktan kaçınmak için.

("--arg-file" ne apt-get (8) adamda ne de aktif kelime dağarcığımda değil).


1

Etrafında çalışmak için.

GNU xargs ve ksh / zsh / bash ile:

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

Komut sadece eğer (tabii ki cat, o zaman değiştirebilirsiniz<(cat packages) ile packages.

Veya:

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

"Paketler" dosyasının biçimine bağlı olarak (xargs, boş bir ayrılmış bağımsız değişkenler listesi ve süreçler tırnak işareti ( "ve 've \) beklerken $(...), tırnakları işlemez ve globbing desenlerini genişletir) şunları da yapabilirsiniz:

sudo apt-get remove $(cat packages)

Ancak, birçok işletim sisteminin bir komut satırının uzunluğunda bir sınırı olduğunu lütfen unutmayın, bu nedenle liste büyükse xargsişe yaramayabilir (ancak birkaç apt-getkomut çalıştırarak bu sorunu giderecektir).


0

Yanılıyor olabilirim, ama bunu deneyebilir ve çalışıp çalışmadığını görebilirsiniz:

yes | sudo apt-get remove $(cat packages)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.