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)
xargs
tidak dapat berjalan cd
karena itu, karena keharusan, shell builtin dan xargs
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 dijalankan cd
karena cd
merupakan perintah bawaan dan xargs
hanya dapat menjalankan file yang dapat dieksekusi.cd
dalam 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 cd
dan 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'