menggunakan xargs untuk melakukan cd ke direktori

28

Merasa seperti orang idiot sekarang. Mengapa ini tidak berhasil?

echo "/some/directory/path" | xargs -n1 cd
Ian Lotinsky
sumber

Jawaban:

22

Pipa menjalankan xargs dalam suatu subproses, dan xargs menjalankan cd dalam suatu subproses. Perubahan dalam suatu subproses tidak disebarkan ke proses induk.

Ignacio Vazquez-Abrams
sumber
Itu masuk akal sepenuhnya. Terima kasih telah membantu noix Unix.
Ian Lotinsky
3
Anda bisa mendapatkan efek yang Anda inginkan dengan menggunakan tanda kutip kembali: 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)
Slartibartfast
5
Sebenarnya, xargstidak dapat berjalan cdkarena itu, karena keharusan, shell builtin dan xargshanya dapat menjalankan executable yang berdiri bebas. Apa yang Anda katakan benar tentang subproses.
Dijeda sampai pemberitahuan lebih lanjut.
/ usr / bin / cd jelas merupakan perintah terdokumentasi Unix yang berdiri bebas, setidaknya pada Solaris.
jlliagre
Menggunakan @ Slartibartfast untuk jalur yang dibuat secara otomatis: cd `port file libcudd | sed -e 's/\/Portfile//'` (biasanya jalur panjang yang tidak ingin Anda tangani secara manual, seperti lokasi Portfile MacPorts ini).
Ioannis Filippidis
23

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:

  1. xargstidak dapat dijalankan cdkarena cdmerupakan perintah bawaan dan xargshanya dapat menjalankan file yang dapat dieksekusi.
  2. Bahkan jika Anda menjalankan 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'
parpa
sumber
Tidak masuk akal untuk melakukannya ls | xargs ...dalam contoh ini. Itu harus melewati nilai untuk $0, sepertiecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
wisbucky
IMO solusi yang lebih baik adalah: ls | xargs -L 1 -I @@ bash -c 'cd @@ && pwd && ls'
Roman M