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)
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.
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:
xargskhông thể chạy cdvì cdlà lệnh tích hợp và chỉ xargscó thể chạy các tệp thực thi.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'
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'