menggunakan xargs untuk melakukan cd ke direktori


28

Merasa seperti orang idiot sekarang. Mengapa ini tidak berhasil?

echo "/some/directory/path" | xargs -n1 cd

Jawaban:


22

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


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'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.