sử dụng xargs để cd vào một thư mục


28

Cảm giác như một thằng ngốc ngay bây giờ. Tại sao cai nay không hoạt động?

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

Câu trả lời:


22

Ống chạy xargs trong một quy trình con và xargs chạy cd trong một quy trình con. Những thay đổi trong một quy trình con không được truyền đến quy trình cha.


Điều đó làm cho ý nghĩa hoàn chỉnh. Cảm ơn vì đã giúp một Unix noob.
Ian Lotinsky

3
Bạn có thể có được hiệu ứng bạn muốn bằng cách sử dụng dấu ngoặc kép: cd `echo "/some/directory/path" | cut -d\ -f1` (Lưu ý rằng tôi đã thêm 'cắt' để phân chia trên khoảng trắng và lấy mục đầu tiên theo cách xargs thực hiện)
Slartibartfast

5
Trên thực tế, xargskhông thể chạy cdvì nó là cần thiết, một vỏ được tích hợp sẵn và xargschỉ có thể chạy các tệp thực thi độc lập. Tuy nhiên, những gì bạn nói là đúng về quy trình con.
Tạm dừng cho đến khi có thông báo mới.

/ usr / bin / cd chắc chắn là một lệnh tài liệu đứng miễn phí Unix, ít nhất là trên Solaris.
jlliagre

Sử dụng @Slartibartfast cho các đường dẫn được tạo tự động: cd `port file libcudd | sed -e 's/\/Portfile//'` (thường là các đường dẫn dài mà bạn không muốn xử lý thủ công, như vị trí Portfile MacPorts này).
Ioannis Filippidis

23

Lệnh cdđược tích hợp sẵn vì thông tin về thư mục hiện tại được gắn với một tiến trình và chỉ vỏ được tích hợp mới có thể thay đổi thư mục hiện tại của shell đang chạy.

Có hai vấn đề với mã của bạn:

  1. xargskhông thể chạy cdcdlà lệnh tích hợp và chỉ xargscó thể chạy các tệp thực thi.
  2. Ngay cả khi bạn chạy cdtrong một quy trình con được gọi từ xargs, nó sẽ không có bất kỳ ảnh hưởng nào đến quy trình cha mẹ như được giải thích ở trên.

Giải pháp là chạy một shell con, bên trong nó chạy cdvà sau đó bạn có thể thực thi các lệnh trong thư mục hiện tại mới.

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'

Nó không có ý nghĩa để làm ls | xargs ...trong ví dụ này. Nó sẽ được chuyển qua giá trị cho $0, nhưecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
wvducky

IMO một giải pháp tốt hơn sẽ là: ls | xargs -L 1 -I @@ bash -c 'cd @@ && pwd && ls'
Roman M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.