CD를 자동으로 ls로 만들기


46

나는 종종 다음과 같은 일을한다 :

%> cd bla/bla
%> ls

cd디렉토리에 들어갈 때마다 자동으로 수행하고 싶습니다 ls.

나는 .bashrc잠시 동안 내 바이올린을 사용 했지만 어떻게 그렇게하는지 알 수 없었다.

답변:


50

함수를 사용하여이를 수행 할 수 있습니다.

$ cdls() { cd "$@" && ls; }

&&' cd는 디렉토리에 대한 의미 이며 성공한 경우 (예 : 디렉토리가 존재하는 경우) ls'를 실행하십시오 . 은 Using &&운영자 더 나은 다음 세미콜론 사용하다 ;와 같이, 두 개의 명령 사이에서 오퍼레이터 { cd "$@" ; ls; }. 이 두 번째 명령은 작동 ls여부에 관계없이 실행 됩니다 cd. cd실패 하면 ls현재 디렉토리의 내용을 인쇄하여 사용자에게 혼란을 줄 것입니다. 모범 사례로 사용 &&하지 말고 사용하십시오 ;.

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

일반적으로, 특히 일반적으로 호출되는 명령의 경우 이미 존재하는 명령의 이름을 바꾸는 것은 좋지 않습니다 cd. 대신 다른 이름으로 새 명령을 작성하십시오. cd이라는 이름의 함수 나 별칭으로 덮어 쓰면 cd100,000 개의 파일이있는 디렉토리를 입력하면 어떻게됩니까? 를 사용하는 많은 유틸리티가 cd있으며이 비정상적인 동작으로 인해 혼동 될 수 있습니다. 공유 계정을 사용하는 경우 ( root다른 시스템 관리자와 작업 할 때 와 같이 ) 사람들이 기대하는 것과 환경이 다르기 때문에 기존 명령을 바꾸는 것이 매우 위험 할 수 있습니다.


이 명령은 실제로 디렉토리를 변경합니까? bash의 매뉴얼 페이지에서 : "대체 텍스트에 인수를 사용하는 메커니즘이 없습니다. 인수가 필요한 경우 쉘 함수를 사용해야합니다"
enzotib

@enzotib : 예, 이것은 적어도 나에게 디렉토리를 변경합니다. 의 출력을 표시하도록 답변을 업데이트했습니다 pwd. 이것이 모범 사례인지 확실하지 않지만 일반적으로 수행됩니다. 몇 가지 예는 tldp.org/LDP/abs/html/aliases.html 을 참조하십시오 .
Stefan Lasiewski

2
첫째 : 여기에서 작동하지 않습니다. 둘째 : 해당 페이지에서 위치 매개 변수가 아닌 변수를 사용합니다. 셋째 : ABS는 일반적인 나쁜 관행입니다.
enzotib

1
이 별칭은 Snow Leopard에서는 작동하지만 CentOS5 또는 CentOS6에서는 작동하지 않습니다. 함수 만 사용하도록 답변을 업데이트했습니다. 별칭이 없습니다.
Stefan Lasiewski

1
나를 위해 작동하지 않습니다. @frabjous 답변을 시도하고 작동합니다 :-macOS에서 cd() { builtin cd "$@" && pwd; };표준 Bourne 쉘 사용 (Sierra 10.12.6)
Swivel

39

나는 이것을 .bashrc에 가지고 있으며 잘 작동한다.

function cd {
    builtin cd "$@" && ls -F
    }

내 .bashrc의 이전에는 다음 [ -z "$PS1" ] && returncd있습니다.


1
정확히 무엇을 [ -z "$PS1" ] && return합니까?
syntagma

2
[ -z "$PS1" ]검사를하는 경우 $PS(대화 형 프롬프트 변수) "제로 길이"입니다 (-z). 길이가 0이면 설정되지 않았으므로 Bash가 대화식 모드에서 실행되지 않아야합니다. && return부분은 소싱에서 종료 .bashrc이러한 조건에서,이 시점에서.
frabjous

1
상호 작용을 확인하는 또 다른 방법을 찾는 것입니다 i"$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda

@ Kusalananda & Frabjous : 하나 대신 다른 것을 사용해야하는 경우가 있습니까?
스위블

1
@Swivel PS1변수가 설정되지 않았거나 비어 있고 셸이 여전히 대화 형일 수 있지만 프롬프트는 표시되지 않습니다. 나는 $-확인합니다.
Kusalananda

13

질문에 / bash 태그가 붙어 있기 때문에 주제를 벗어난 주제이지만 일부 질문은 bash를 언급하지 않은이 질문과 중복되어 닫힙니다.

zsh로 :

chpwd() ls

chpwd () 함수는 현재 디렉토리가 변경 될 때마다 (cd, push, popd ...) zsh에 의해 호출됩니다. tcsh는 비슷한 기능을 가지고 있으며 아마도 zsh가 제공 한 곳일 것입니다.


4

.bashrc 파일에 별칭을 추가하지 않으시겠습니까?

다음과 같은 것 :

alias cdls='cd "$@" && ls'

@don_crissti 기능과 별칭은 다릅니다. 그래서 왜 안돼?
Jodka Lemon

이것은 OP가 요청한 것을 수행하는 가장 빠르고 깨끗한 방법입니다. 필자의 의견으로는 함수를보다 복잡한 작업에 사용해야하지만 종종 입력되는 명령의 바로 가기를 만드는 것이 별칭이 존재하는 것입니다.
Ghos3t

이 별칭과 함께 이상한 문제가 있습니다 .cdls projec2와 같이 사용하면 프로젝트 2 폴더의 모든 파일이 표시되지만 실제로는 해당 폴더로 cd되지 않고 대신 원래 폴더에 남아 있습니다.
Ghos3t

2

cd 명령에 대한 별명 작성의 일반적인 솔루션은 popd와 같이 현재 디렉토리를 변경하거나 cd 명령으로 스크립트를 실행할 수있는 다른 명령이 있기 때문에 완벽하지 않습니다.

프롬프트를 리턴하기 전에 명령을 실행하는 $ PROMPT_COMMAND Bash 후크를 사용하는 것이 좋습니다.

명령 (이 경우 함수)은 디렉토리가 화면 노이즈를 줄이기 위해 변경된 경우에만 ls를 실행합니다. .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

이것을 복사하십시오 :

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

이제 당신은 간단한 CD를 할 수 있습니다 :

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

1

bash에서는 매개 변수가 필요한 조치의 별명으로 되풀이 할 수 없습니다. 이를 위해 기능이 있습니다. 그래서 당신 ~/.bashrc의 다음을 넣어

mycd() {
  cd "$1"
  ls
}


ls 명령에 매개 변수를 허용하기 위해 함수 mycd {builtin cd $ 1 && ls $ 2}를 사용합니다. 이제 다음 명령을 호출 할 수 있습니다. 예 : mycd .. -la
Christian Schulzendorff

@ChristianSchulzendorff : 따옴표를 사용하는 것이 좋습니다 : function mycd { builtin cd "$1" && ls "$2" } .
enzotib

작동하지 않습니다. 방금 시도했습니다. 파일이 비어 있지만 코드를 추가 한 후에는 아무것도 변경되지 않았습니다.
Black

0

아래 코드를 .profile에 넣으면 작동합니다. HP-Unix 상자에서 테스트했습니다.

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

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

0

더 편리- 역사로 돌아갈 수있는 능력 :

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

디렉토리를 변경하면 다음과 같은 줄 Stack: (current_dir) (previous_dir) ...이 표시되고 ls출력됩니다. dirs history로 돌아가려면 다음 명령을 팝업하십시오 popd.

else잘못된 디렉토리로 이동하려고 할 때 오류가 표시되도록 추가했습니다 .


당신이 단지 cd를한다면 – 그것은 당신이 있었던 마지막 디렉토리로 당신을 데려 올 것입니다.
Ian

0

ls옵션이 없으므로이 옵션 을 사용하는 것이 좋습니다 cd.

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

음 ... cd옵션이 있습니다.
Kusalananda

0

유용한 정보는 다음과 같습니다 (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
    '
}

이렇게하면 해당 디렉토리에 너무 많은 항목이있어 콘솔이 깨끗하게 유지되는 경우 줄임표가있는 출력이 잘립니다.

$ 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

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

이것은 다른 답변이 아직 다루지 않은 것을 추가합니다.
jasonwryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.