đẩy, popd vs cd, cd- trong bash và zsh


16

Có sự khác biệt giữa hành vi của Pushd / popd trong bash vs zsh không? Có vẻ như trong zsh cd, cd- hoạt động giống hệt như Pushd / popd (tự động thêm thư mục / pops khi cd) trong khi bash cd không ảnh hưởng đến ngăn xếp dir.

Nếu ai đó có thể cho tôi một con trỏ sẽ là tuyệt vời.


Tôi chỉ có thể nói với bash: sử dụng cdđặt biến shell OLDPWDcho thư mục trước đó và cd -được dịch sang cd "$OLDPWD".
glenn jackman

@glennjackman, cảm ơn. Điều đó có nghĩa là trong bash cd không có gì để làm w / pushd / popd?
dragonxlwang

Tôi vừa kiểm tra, và pushdcũng thiết lậpOLDPWD
glenn jackman

Và dirstack, trả về bởi dirsluôn giữ PWD là yếu tố đầu tiên
glenn Jackman

có, nhưng nó cũng có ý nghĩa rất lớn nếu cd không chạm vào ngăn xếp dir được quản lý bởi Pushd / popd trong bash.
dragonxlwang

Câu trả lời:


17

Nó phụ thuộc. Trong zshbạn có thể cấu hình cdđể tự động đẩy thư mục cũ trên ngăn xếp thư mục, nhưng nó không phải là cài đặt mặc định.

Theo như tôi có thể nói zshvới các thiết lập mặc định hoạt động rất giống với bash:

  • cd somedir
    • thay đổi thư mục thành somedir
    • lưu thư mục gốc trong OLDPWD
    • bộ PWD="somedir"
    • thay thế phần tử trên cùng của ngăn xếp thư mục (như được hiển thị bởi dirs) bằng somedir(số phần tử trên ngăn xếp không thay đổi).
  • cd -:
    • thay đổi thư mục thành $OLDPWD
    • trao đổi giá trị của PWDOLDPWD
    • sửa đổi phần tử trên cùng của ngăn xếp thư mục để phản ánh (cái mới) PWD
  • pushd somedir:
    • thay đổi thư mục thành somedir
    • lưu thư mục gốc trong OLDPWD
    • bộ PWD="somedir"
    • đẩy somedirvào ngăn xếp thư mục (mở rộng nó bằng một yếu tố)
  • popd:
    • lưu thư mục gốc trong OLDPWD
    • xóa phần tử đầu tiên của ngăn xếp thư mục
    • thay đổi thư mục thành phần tử trên cùng mới của ngăn xếp thư mục
    • được đặt thành PWDphần tử trên cùng mới của ngăn xếp thư mục

Lưu ý: Liệu thư mục làm việc hiện tại có được coi là một thành phần của ngăn xếp thư mục khác nhau giữa zshbash. Tôi đã sử dụng bashnhư tài liệu tham khảo cho các danh sách trên.

  • Trong bashthư mục làm việc hiện tại được coi là phần tử hàng đầu của ngăn xếp thư mục. Các man 1 bashnói:

    pushd [-n] [dir]

    [V]] Thêm dirvào ngăn xếp thư mục ở trên cùng, làm cho nó trở thành thư mục làm việc hiện tại mới như thể nó đã được cung cấp làm đối số cho cdnội dung. [Càng]

    Printing DIRSTACK( echo ${dirstack[@]}) xác nhận rằng phần tử đầu tiên giống hệt $PWD.

  • Trong zshthư mục làm việc hiện tại không phải là một phần của ngăn xếp thư mục (nhưng vẫn được hiển thị với dirs). man 1 zshbuiltinsnói:

    pushd [ -qsLP ] [ arg ]

    [Vuốt] Thay đổi thư mục hiện tại và đẩy thư mục hiện tại cũ lên ngăn xếp thư mục. Ở dạng đầu tiên, thay đổi thư mục hiện tại thành arg. [Càng]

    In dirstack( echo ${dirstack[@]}) và so sánh nó với đầu ra của dirssẽ cho thấy rằng đó PWDkhông phải là một phần của `dirstack.

Trong cả hai shell dirsin thư mục làm việc hiện tại là phần tử đầu tiên. Cũng trong cả hai shell, phần tử ngăn xếp thư mục với chỉ mục 1đề cập đến thư mục hiện tại trước cuối cùng pushd. Đó là bởi vì các mảng trong zshthường được đánh số từ 1, trong khi chúng được đánh số từ 0trong bash. Vì vậy, có rất ít sự khác biệt thực tế


Như đã nói ở trên, hành vi này có thể được sửa đổi trong zsh.

Nếu bạn đặt AUTO_PUSHDtùy chọn trong zsh( setopt autopushd) cd somedirhoạt động như thế pushd somedir, thư mục trước sẽ tự động được đẩy lên ngăn xếp thư mục. Đây có lẽ là trường hợp trên máy của bạn. Bạn có thể chạy setoptđể nhận danh sách các tùy chọn không được đặt theo cách mặc định. Xem, cho dù autopushdxuất hiện trong danh sách.

Nhưng điều này không sửa đổi cd -để hành xử như thế nào popd. Thay vào đó, nó chỉ đẩy $PWDvào ngăn xếp thư mục và thay đổi thư mục thành $OLDPWD. Điều đó có nghĩa là liên tục gọi cd -sẽ thực sự phát triển ngăn xếp thư mục ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Nếu nó thực sự hoạt động chính xác như popdtrên hệ thống của bạn, tôi sẽ đề xuất nếu cdthực sự là nội dung ( whence -v cd); có thể là nó được thay thế bằng một bí danh hoặc chức năng.

Vì ngăn xếp thư mục sẽ phát triển khá nhanh khi AUTO_PUSHDđược bật, bạn có thể giới hạn kích thước của nó bằng cách đặt tham số DIRSTACKSIZEở kích thước tối đa mong muốn.
Bạn cũng có thể ngăn ngừa trùng lặp bằng cách đặt PUSHD_IGNORE_DUPStùy chọn.
Để biết thêm lựa chọn, hãy xem hướng dẫn .


mục đích của ngăn xếp thư mục ngoài việc nhìn vào nó là dirsgì?
Xerus

@Xerus Nó cho phép quay lại các thư mục đã truy cập trước đó popdmà không cần phải nhập (hoặc thậm chí biết) đường dẫn.
Adaephon
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.