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ả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:
Ố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.
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)
xargs
không thể chạy cd
vì nó là cần thiết, một vỏ được tích hợp sẵn và xargs
chỉ 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.
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).
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:
xargs
không thể chạy cd
vì cd
là lệnh tích hợp và chỉ xargs
có thể chạy các tệp thực thi.cd
trong 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 cd
và 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'
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'