Nó không phải là các đường ống đi trở lại vào thư mục, đó là bạn đã thực hiện lệnh đầu tiên (trước dấu chấm phẩy) chỉ áp dụng cho các lệnh cat
. Về cơ bản, bạn đang tạo đường ống cho đầu ra của quy trình con của các số mkdir
và cd
và pwd
chuyển đến quy trình cat
.
Ví dụ: { mkdir dir; cd dir; pwd; } | cat; pwd;
Đầu tiên mở rộng thành hai quá trình: 1) { mkdir dir; cd dir; pwd; } | cat;
và 2) pwd
Quá trình đầu tiên mở rộng thành hai quy trình, { mkdir dir; cd dir; pwd; }
mà sau đó gửi stdout
của nó để stdin
của cat
. Khi người đầu tiên của các quá trình hai kết thúc và stdout
được thu thập, thoát trình con của nó và nó cũng giống như cd
bao giờ xảy ra vì cd
chỉ ảnh hưởng đến các thư mục của quá trình đó đang chạy vào. pwd
bao giờ thực sự đã thay đổi $PWD
, nó chỉ in được cung cấp trên stdin
.
Để giải quyết vấn đề này (giả sử tôi hiểu những gì bạn đang cố gắng để làm) tôi sẽ thay đổi điều này để:
{ mkdir dir; cd dir; pwd; }; pwd; cd -
http://stackoverflow.com/questions/5760640/left-side-of-pipe-is-the-subshell, 'cd' của bạn chạy trong một vỏ con. – Mat
Trong tập lệnh thứ hai, nó cũng nằm trong subshell – yegor256
@ yegor256 Không, trong lần thứ hai nó ** không ** trong một vỏ bọc con. – devnull