"모두 표시가능성? (y 또는 n)"은 ls 명령을 나타냅니다.

"모두 표시가능성? (y 또는 n)"은 ls 명령을 나타냅니다.

bash 프롬프트에서 전체 파일 이름을 탭하려고 하면 출력은 많은(>100) 파일 이름이 되며 쉘은 다음을 묻습니다.Display all <num> possibilities? (y or n)

ls일반 명령을 사용하여 이 동작을 복제 할 수 있습니까 ?

400,000개가 넘는 파일이 있는 디렉토리가 있습니다. 실수로 ls이 디렉터리에 액세스하면 셸이 오랫동안 응답하지 않아 출력이 쏟아질 수 있습니다. Ctrl-C홍수는 멈추지 않습니다.

답변1

내 솔루션은 약간 무거울 수 있지만 누가 알겠습니까?

문제는 이를 수행하려면 파일 수를 세어야 한다는 것입니다. 일반적으로 다음과 같이 수행됩니다.

$ ls | wc -l

이제 콘텐츠가 stdout 대신 파이프에 기록되므로 완료하는 데 약간의 시간이 걸립니다(터미널에 쓰는 데 약간의 시간이 걸리며 이는 400,000번의 호출 이후에 중요해질 것입니다).write(2)). 여전히 시간이 좀 걸릴 수 있지만 그럼에도 불구하고 간단한 테스트를 통해 이를 달성할 수 있습니다.

#!/bin/bash

LIMIT=1000
n=$(ls "$@" 2>/dev/null | head -n$LIMIT | wc -l)

if [ $n -ge $LIMIT ]; then
    echo "This directory contains more than $LIMIT entries."
    echo -n "Are you sure want to continue? (y/N) "

    read confirm
    if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
        exec ls "$@"
    fi
else
    exec ls "$@"
fi

그런 다음 파일에 별칭을 설정 .bashrc하고 대신 이 스크립트를 호출하세요 /bin/ls.

alias ls='/path/to/my_ls.sh --color=auto'

또한 올바르게 chmoded되었는지 확인하십시오.

$ chmod +x /path/to/my_ls.sh

편집하다:출력 라인 뒤에 종료 head호출 을 추가했습니다 . 이렇게 하면 시간이 절약되고 실제로 더 나은 솔루션이 됩니다 ;)ls$LIMITtimeout

제가 제안하고 싶은 또 다른 접근 방식은 시간 제한을 사용하는 것입니다. 5초 내에 완료되지 않으면 ls중지하고 확실한지 물어봅니다. 다음은 예제 스크립트입니다(단지 하나가 아닌 여러 명령에 유효함 ls).

#!/bin/bash                                                                                                                                                                                

TIMEOUT=5

if [ $# -le 0 ]; then
    echo "Usage: $0 [command]"
    exit 1
fi

# Try it silently for a few seconds...
timeout $TIMEOUT "$@" >/dev/null 2>&1

if [ $? -eq 124 ]; then
    echo -n "Your command failed to run under "$TIMEOUT"s. "
    echo -n "Retry without a timeout? (y/N) "

    read confirm
    if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
        exec "$@"
    fi
else
    exec "$@"
fi

그런 다음 다음과 같은 별칭을 설정할 수 있습니다.

alias ls='/path/to/script.sh ls --color=auto'
alias grep='/path/to/script.sh grep --color=auto'
alias cat='/path/to/script.sh cat'

테스트중이니 참고해주세요 $? -eq 124..

명령 시간이 초과되어 --preserve-status설정되지 않은 경우 상태 124로 종료됩니다.

바라보다timeout(1)더 많은 정보를 알고 싶습니다.

관련 정보