Làm cách nào để ngăn lệnh 'cd' vào thư mục chính?


10

Có điều là đôi khi tôi gõ cdnhầm và điều đó đưa tôi đến thư mục chính.

ví dụ: tôi đang ở trong một thư mục có một thư mục ẩn và một thư mục hiển thị, tôi nhanh chóng nhấn cd+ tabvà nó sẽ đưa tôi đến thư mục chính


30
Nếu bạn cdở đâu đó một cách tình cờ, hãy sử dụng cd -để quay lại vị trí trước đó của bạn - bash giữ $OLDPWDbiến cho mục đích này. Xem gnu.org/software/bash/manual/bash.html#index-cd
glenn jackman

4
Nếu bạn thực sự không muốn cdlàm gì, bạn có thể viết một hàm có tên cdmà không làm gì khi không có đối số nào được đưa ra, nếu không hãy gọibuiltin cd "$@"
glenn jackman

2
Ý tưởng thực sự tồi tệ: HOME =.
Joshua

26
Lời khuyên chân thành nhất của tôi là làm chậm và học cách kiểm tra lệnh trước khi bạn thực thi nó. Nói cách khác: làm quen với cdbất cứ điều gì nó làm. Nếu bạn giữ thói quen thực hiện các lệnh mà bạn chưa kiểm tra hai lần, bạn sẽ gặp rắc rối lớn hơn nhiều sau này. Ví dụ: bạn muốn di chuyển hai tệp vào thư mục thứ ba: mv a b dir/và việc hoàn thành TAB không tạo ra dirnhư bạn mong đợi, cuối cùng bạn sẽ thực hiện mv a bghi đè nào b. Học cách cẩn thận, học cách xem lệnh trước khi nhấn Enter.
egmont

1
@Joe Tôi đã viết một kịch bản wrapper cho rmđể ngăn chặn xóa các thư mục cấp cao nhất như /, /etc, /usr, /home, /var, vv mà không một ghi đè mật khẩu. Đôi khi chúng ta cần sự bảo vệ từ chính mình :)
WinEunuuchs2Unix

Câu trả lời:


14

Sử dụng gedit ~/.bashrcvà chèn các dòng này ở dưới cùng:

cd() {
    [[ $# -eq 0 ]] && return
    builtin cd "$@"
}

Mở một thiết bị đầu cuối mới và bây giờ khi bạn gõ cdkhông có tham số, bạn chỉ cần ở trong cùng một thư mục.


TL; DR

Nếu bạn muốn thực sự trau chuốt, bạn có thể đặt vào màn hình trợ giúp khi không có thông số nào được thông qua:

$ cd

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

Mã mở rộng để thực hiện điều này là:

cd() {
    if [[ $# -eq 0 ]] ; then
        cat << 'EOF'

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

EOF
        return
    fi

    builtin cd "$@"
}

6
Nhưng sau đó, bạn đã làm cho môi trường của bạn hoạt động như không có môi trường khác. Tại sao không gọi hàm ncd(cho "New cd") và để thực sự cdmột mình?
ví von

@waltinator Tôi có thể cải thiện câu trả lời bằng một cảnh báo về cách thức cd (trống) hoạt động khác nhau đối với những người bên cạnh người dùng gia đình ~/.bashrc. Bạn có thể đưa ra một ví dụ hoặc hai những gì cần chú ý? ví dụ: Một nhà phát triển sử dụng cd (để trống) trong tập lệnh cài đặt của họ. (Giả thuyết nhưng tôi không thể nghĩ ra trường hợp nào). Tôi có thể đưa ra các ví dụ của bạn vào câu trả lời và đề nghị OP sử dụng ncdmọi lúc thay vì cd.
WinEunuuchs2Unix

Tôi thích tùy chỉnh mọi thứ. Đó là những gì Linux nói về. Nhưng tôi có một quy tắc cá nhân nghiêm ngặt không bao giờ thay đổi chức năng (không có ý định chơi chữ) của bất kỳ lệnh phổ biến nào. Điều này mở ra các vấn đề khi bạn làm việc trên một hệ thống khác hoặc khi người khác làm việc hoặc tư vấn cho bạn về hệ thống của bạn. Tôi đồng ý với @waltinator và Joe "tốt" khác
Joe

6

Nếu việc hoàn thành tab đó gây ra điều này, một tùy chọn là thực hiện chu trình hoàn thành thông qua các mục ngay lập tức. Điều này có thể được thực hiện bằng cách sử dụng tùy chọn readlinemenu-comple thay vì mặc định complete:

bind 'tab: menu-completion'

Sau đó, trong thư mục nhà của tôi, ví dụ:

$ cd <tab> # becomes
$ cd .Trash

Tất nhiên, thậm chí sau đó bạn phải đọc những gì bạn đang thực hiện.


4

Đây là cách tôi đặt thư mục và người dùng hiện tại vào tiêu đề windows của mình - Bạn có thể điều chỉnh nó theo nhu cầu của mình, nhưng cd -, tương đương với cd $OLDPWDlà một giải pháp tốt hơn.

Từ tôi ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

4

Vấn đề ở đây là không cd, và nó không được sửa chữa bởi công nghệ.

Vấn đề là bạn, và nó được sửa chữa bằng sự kiên nhẫn!

Nếu bạn thường xuyên thấy mình gõ và gửi các lệnh mà bạn không muốn, hãy thực hành chậm lại . Hãy hít thở, đọc những gì bạn đang gõ và kiểm tra kỹ trước khi nhấn enter. Hãy nghĩ thật thông suốt. Đừng vội vàng.

Bạn sẽ thấy rằng phương pháp này không chỉ giải quyết vấn đề trong tay, mà còn những vấn đề tồi tệ khác mà bạn sẽ gặp phải nếu bạn tiếp tục đi xuống con đường hiện tại của mình.


2
Ngoài ra, sau vài tháng / năm sử dụng, bạn sẽ quên rằng mình đã thay đổi hành vi và sẽ gặp vấn đề khi làm việc trong các môi trường khác.
pLumo

@RoVo Điều đó cũng vậy, điểm tốt!
Các cuộc đua nhẹ nhàng trong quỹ đạo

@RoVo Điều đó có thể xảy ra trong một vài ngày. Ngay lập tức, nếu bạn khởi động kép, hãy chuyển sang VM ...
Joe

@Joe Gần đây tôi đã chuyển đổi giữa OSX vào ban ngày và Windows vào buổi tối và sự thay đổi bố cục bàn phím thực sự khó hiểu!
Các cuộc đua nhẹ nhàng trong quỹ đạo

@LightnessRacesinOrbit Tôi chắc chắn! Tôi có hai bàn phím máy tính xách tay có kích thước khác nhau với bố cục gần như giống nhau và điều đó đủ tệ. Đó cũng là lý do tại sao tôi chưa bao giờ thử bàn phím Dvorak. Chỉ không chắc chắn làm thế nào điều này liên quan đến câu hỏi.
Joe
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.