Merasa seperti orang idiot sekarang. Mengapa ini tidak berhasil?
echo "/some/directory/path" | xargs -n1 cd
Pipa menjalankan xargs dalam suatu subproses, dan xargs menjalankan cd dalam suatu subproses. Perubahan dalam suatu subproses tidak disebarkan ke proses induk.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Perhatikan bahwa saya menambahkan 'potong' untuk membagi pada spasi dan ambil item pertama seperti yang dilakukan xargs)xargs
tidak dapat berjalancd
karena itu, karena keharusan, shell builtin danxargs
hanya dapat menjalankan executable yang berdiri bebas. Apa yang Anda katakan benar tentang subproses.cd `port file libcudd | sed -e 's/\/Portfile//'`
(biasanya jalur panjang yang tidak ingin Anda tangani secara manual, seperti lokasi Portfile MacPorts ini).Perintah
cd
ini adalah built-in karena informasi tentang direktori saat ini terkait dengan suatu proses dan hanya shell built-in yang dapat mengubah direktori saat ini dari shell yang sedang berjalan.Ada dua masalah dengan kode Anda:
xargs
tidak dapat dijalankancd
karenacd
merupakan perintah bawaan danxargs
hanya dapat menjalankan file yang dapat dieksekusi.cd
dalam sub-proses yang dipanggil darixargs
, itu tidak akan berpengaruh pada proses induk seperti yang dijelaskan di atas.Solusinya adalah dengan menjalankan sub-shell, di dalamnya jalankan
cd
dan kemudian Anda dapat menjalankan perintah di direktori saat ini yang baru.sumber
ls | xargs ...
dalam contoh ini. Itu harus melewati nilai untuk$0
, sepertiecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'