Şu an aptal gibi hissediyorum. Bu neden çalışmıyor?
echo "/some/directory/path" | xargs -n1 cd
Şu an aptal gibi hissediyorum. Bu neden çalışmıyor?
echo "/some/directory/path" | xargs -n1 cd
Yanıtlar:
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.
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)
xargs
koşamam cd
o gereklilik, bir kabuk yerleşiği, olduğundan ve xargs
sadece serbest duran yürütülebilir çalıştırabilirsiniz. Ancak, söylediğiniz şey alt işlemler hakkında doğrudur.
cd `port file libcudd | sed -e 's/\/Portfile//'`
(genellikle MacPorts Portfile konumu gibi manuel olarak işlem yapmak istemedikleriniz).
Komut cd
yerleş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:
xargs
Çalıştırılamaz cd
çünkü cd
yerleşik bir komuttur ve xargs
yalnızca çalıştırılabilir dosyaları çalıştırabilir.cd
Denilen 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 cd
ve 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 $0
gibiecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'