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.