it-mot-dan-vi.com

Tạo cd tự động ls

Tôi thấy rằng tôi thường làm như sau:

%> cd bla/bla
%> ls

Tôi muốn rằng bất cứ khi nào tôi cd vào một thư mục, nó sẽ tự động thực hiện một ls.

Tôi loay hoay với .bashrc trong một thời gian, nhưng không thể tìm ra cách để làm cho nó xảy ra.

51
RobKohr

Bạn có thể làm điều này với một chức năng:

$ cdls() { cd "[email protected]" && ls; }

&& Có nghĩa là 'cd cho một thư mục và nếu thành công (ví dụ: thư mục tồn tại), hãy chạy ls'. Sử dụng toán tử && Thì tốt hơn là sử dụng toán tử dấu chấm phẩy ; Ở giữa hai lệnh, như với { cd "[email protected]" ; ls; }. Lệnh thứ hai này sẽ chạy ls bất kể cd có hoạt động hay không. Nếu cd không thành công, ls sẽ in nội dung của thư mục hiện tại của bạn, điều này sẽ gây nhầm lẫn cho người dùng. Cách tốt nhất là sử dụng && Chứ không phải ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

Nói chung, việc đổi tên một lệnh đã tồn tại là một thực tế tồi, đặc biệt đối với một lệnh thường được gọi là cd. Thay vào đó, tạo một lệnh mới với một tên khác. Nếu bạn ghi đè cd bằng một hàm hoặc bí danh cũng được đặt tên cd, điều gì sẽ xảy ra khi bạn nhập một thư mục có 100.000 tệp? Có nhiều tiện ích sử dụng cd và chúng có thể bị nhầm lẫn bởi hành vi bất thường này. Nếu bạn sử dụng tài khoản dùng chung (Chẳng hạn như root khi bạn làm việc với các quản trị viên hệ thống khác), sẽ rất nguy hiểm khi thay thế một lệnh hiện có vì môi trường khác với những gì mọi người mong đợi.

54
Stefan Lasiewski

Tôi có cái này trong .bashrc của tôi và nó hoạt động tốt.

function cd {
    builtin cd "[email protected]" && ls -F
    }

Trước đó trong .bashrc của tôi, tôi có: [ -z "$PS1" ] && return và mọi thứ sau dòng đó chỉ áp dụng cho các phiên tương tác, vì vậy điều này không ảnh hưởng đến cách cd hành xử trong các tập lệnh.

42
frabjous

ngoài chủ đề, vì câu hỏi được gắn thẻ/bash, nhưng vì một số câu hỏi được đóng lại là bản sao của câu hỏi này không đề cập đến bash:

Với zsh:

chpwd() ls

Hàm chpwd () được gọi bởi zsh mỗi khi thư mục hiện tại thay đổi (theo cách của cd, pushd, popd ...). tcsh có một tính năng tương tự và có lẽ là nơi zsh có nó từ đó.

16
Stéphane Chazelas

Tại sao không thêm bí danh vào tệp .bashrc của bạn?

Cái gì đó như:

alias cdls='cd "[email protected]" && ls'
4
Kenneth Aar

Sao chép cái này:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Bây giờ bạn chỉ có thể làm cd đơn giản:

cd / 
(files listed)
cd /home 
(files listed)
etc... 
2

Giải pháp chung cho việc tạo bí danh cho lệnh cd là không hoàn hảo vì có các lệnh khác có thể thay đổi thư mục hiện tại của bạn như popd hoặc thậm chí chạy tập lệnh có lệnh cd trong đó.

Tốt hơn là sử dụng hook $ Prompt_COMMAND Bash để thực thi một lệnh trước khi trả về Prompt.

Lệnh (một chức năng trong trường hợp của chúng tôi) sẽ chỉ thực hiện ls nếu thư mục đã thay đổi để giảm nhiễu màn hình. Mã cho .bashrc:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when Shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    Prompt_COMMAND=LsAfterCd
2
Jack

Trong bash, bạn không thể lặp lại thành bí danh cho hành động yêu cầu tham số. Đối với điều này có chức năng. Vì vậy, hãy đặt ~/.bashrc Sau đây

mycd() {
  cd "$1"
  ls
}
1
enzotib

Đặt mã dưới đây vào .profile và nó hoạt động. Đã thử nghiệm trên hộp HP-Unix.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
Elif [ -d "[email protected]" ]; then
cd "[email protected]" && ls -ltr
else
echo "[email protected]" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"
0
user196161

Tôi nghĩ thật tốt khi bật các tùy chọn của ls theo cách này vì cd không có tùy chọn.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
0
iBug

Thậm chí tiện dụng hơn - với khả năng quay lại lịch sử:

function cd() {
    if [ -d "[email protected]" ]; then
        echo -n "Stack: "
        pushd "[email protected]"
        ls
    else
        builtin cd "[email protected]"
    fi
}
function popd() {
    builtin popd "[email protected]" && ls
}

Khi bạn thay đổi thư mục, một dòng có: Stack: (current_dir) (previous_dir) ... sẽ được hiển thị, sau đó ls output. Để quay lại lịch sử dirs, chỉ cần bật lệnh này: popd.

Tôi đã thêm else vì vậy bạn sẽ thấy lỗi khi cố chuyển đến một thư mục sai.

0
Ctrl-C

Đây là những gì tôi thấy hữu ích (trên Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an Ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Điều này mang lại cho tôi đầu ra bị cắt với Ellipsis trong trường hợp có quá nhiều mục trong thư mục đó để giao diện điều khiển sạch sẽ:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977
0
Superlexx