Bir dizine cd yapmak için xargs kullanmak


28

Şu an aptal gibi hissediyorum. Bu neden çalışmıyor?

echo "/some/directory/path" | xargs -n1 cd

Yanıtlar:


22

Boru bir alt işlemde xargs çalıştırır ve xargs bir alt işlemde cd çalıştırır. Bir alt işlemdeki değişiklikler ana işleme iletilmez.


Bu tamamen mantıklı. Unix noobuna yardım ettiğin için teşekkürler.
Ian Lotinsky

3
İstediğiniz efekti geri tırnak işaretleri kullanarak alabilirsiniz: cd `echo "/some/directory/path" | cut -d\ -f1` (Boşluklara bölmek ve xargs'ın yaptığı gibi ilk öğeyi almak için 'cut' eklediğime dikkat edin)
Slartibartfast

5
Aslında xargskoşamam cdo gereklilik, bir kabuk yerleşiği, olduğundan ve xargssadece serbest duran yürütülebilir çalıştırabilirsiniz. Ancak, söylediğiniz şey alt işlemler hakkında doğrudur.
sonraki duyuruya kadar duraklatıldı.

/ usr / bin / cd, en azından Solaris'te kesinlikle Unix serbest duran belgelenmiş bir komuttur.
jlliagre,

Otomatik olarak oluşturulan yollar için @Slartibartfast kullanmak: cd `port file libcudd | sed -e 's/\/Portfile//'` (genellikle MacPorts Portfile konumu gibi manuel olarak işlem yapmak istemedikleriniz).
Ioannis Filippidis

23

Komut cdyerleşik bir sistemdir, çünkü geçerli dizin hakkındaki bilgiler bir işleme bağlıdır ve sadece kabuk dahili çalışan kabuktaki mevcut dizini değiştirebilir.

Kodunuzla ilgili iki sorun var:

  1. xargsÇalıştırılamaz cdçünkü cdyerleşik bir komuttur ve xargsyalnızca çalıştırılabilir dosyaları çalıştırabilir.
  2. cdDenilen bir alt süreçte çalıştırsanız bile xargs, yukarıda anlatıldığı gibi ana süreç üzerinde bir etkisi olmayacaktır.

Çözüm, içindeki bir alt kabuğu çalıştırmaktır cdve sonra yeni geçerli dizinde komutları çalıştırabilirsiniz.

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'

ls | xargs ...Bu örnekte yapmak mantıklı değil . Bu değer geçen gerektiğini $0gibiecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
wisbucky

IMO daha iyi bir çözüm olacaktır: ls | xargs -L 1 -I @@ bash -c 'cd @@ && pwd && ls'
Roman M
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.