Merasa seperti orang idiot sekarang. Mengapa ini tidak berhasil?
echo "/some/directory/path" | xargs -n1 cd
Merasa seperti orang idiot sekarang. Mengapa ini tidak berhasil?
echo "/some/directory/path" | xargs -n1 cd
Jawaban:
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)
xargstidak dapat berjalan cdkarena itu, karena keharusan, shell builtin dan xargshanya 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 cdini 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:
xargstidak dapat dijalankan cdkarena cdmerupakan perintah bawaan dan xargshanya dapat menjalankan file yang dapat dieksekusi.cddalam sub-proses yang dipanggil dari xargs, itu tidak akan berpengaruh pada proses induk seperti yang dijelaskan di atas.Solusinya adalah dengan menjalankan sub-shell, di dalamnya jalankan cddan kemudian Anda dapat menjalankan perintah di direktori saat ini yang baru.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...dalam contoh ini. Itu harus melewati nilai untuk $0, sepertiecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'