디렉터리의 파일 수(숨겨진 항목 및 일반 항목)를 포함한 명령 프롬프트(PS1)

디렉터리의 파일 수(숨겨진 항목 및 일반 항목)를 포함한 명령 프롬프트(PS1)

마침내 마음에 드는 PS1 형식을 찾았지만 로딩 시간이 너무 길었습니다.

속도가 느려지는 부분은 프롬프트에서 외부 명령을 호출할 때입니다. 디렉토리의 항목 수와 숨겨진 파일 수를 표시하고 싶습니다.

나는 프롬프트를 만들기 위한 지침으로 다음 두 페이지를 따랐습니다."프롬프트의 외부 명령"그리고“Bash 명령 프롬프트 블로그 사용자 정의”. 나는 Daniel의 "사용자 정의 bash 명령 프롬프트 블로그" 방법이 내가 생각해낸 것보다 더 빠르게 작동하도록 할 수 없었습니다. 어쨌든 그는 왜 \w 대신 "pwd"를 사용했을까요? 또한 왜 그가 var를 생성하고 이를 에코($OUT)하는지 이해할 수 없습니다. 아 뭐, 내가 한 일은 이렇다...

나는 두 가지 방법을 결합하여 아래 방법을 생각해 냈습니다. 작동하지만 원하는만큼 빠르지는 않습니다.

export PS1="\[\e[2;37m\]\d \[\e[2;37m\] @ \[\e[2;37m\] \t \[\e[2;33m\]> Currently in: \[\e[0;33m\]\w [\$(ls -A | wc -l) entries and \$[\$(ls -A | wc -l) - \$(ls | wc -l)$wc -l)] are hidden] \[\e[0m\]
\[\e[2;36m\]\u\[\e[0;37m\]@\[\e[1;32m\]\h\[\e[0;33m\] \$ \[\e[0m\]"

@mikeserv가 제안한 대로 bashrc에서 새로 편집된 명령:

export PS1="\[\e[2;37m\]\d \[\e[2;37m\] @ \[\e[2;37m\] \t \[\e[2;33m\]>Currently in: \[\e[0;33m\] $(($(count_glob c * count_glob h .*)0)) entries and $h are hidden \[\e[0m\]
\[\e[3;36m\]\u\[\e[0;37m\]@\[\e[1;93m\]\h\[\e[0;33m\] \$\[\e[0m\]"

결과는 다음과 같습니다.

Tue Jan 20  @  18:37:58 >Currently in:  24 entries and  are hidden

답변1

count_glob() { 
     [ -e "$1" ]
     echo "($v=$((!$?*$#)))+"
}

위와 같이 함수를 선언할 수 있습니다. 그럼 ls나머지는 하시면 됩니다...

...Currently in: $(($(
    v=c count_glob *
    v=h count_glob .*
)-2)) entries and $((h-2)) are hidden...

여기서는 관련이 없는 이스케이프 시퀀스만 제거했습니다. 이스케이프 시퀀스에서도 작동합니다.

그럼 이제 우리는 모두 함께...

export PS1='\[\e[2;37m\]\d \[\e[2;37m\] @ \[\e[2;37m\] \t \[\e[2;33m\]>'\
'Currently in: \[\e[0;33m\] $(($(
    v=c count_glob * 
    v=h count_glob .*
)-2)) entries and $((h-2)) are hidden '\
'\[\e[3;36m\]\u\[\e[0;37m\]@\[\e[1;93m\]\h\[\e[0;33m\] \$\[\e[0m\]'

좋습니다. 여기서 일어나는 일은 count_glob함수에 모든 매개변수의 매개변수 목록이 제공된다는 것입니다.(숨기거나 말거나)현재 디렉터리의 파일입니다. 특수 매개변수는 $#쉘의 위치 매개변수(해당 매개변수)의 총 개수를 나타내며, 각 쉘 함수에는 고유한 매개변수 세트가 있습니다.

[ -e "$1" ]

...첫 번째 인수가 실제로 존재하는지 확인하는 검사입니다. 이 경우 구문 분석할 파일이 항상 두 개이므로 실제로는 필요하지 않습니다. 하지만 가능 .*합니다 . 디렉터리가 비어 있으면 glob이 확인되지 않고 계속됩니다 . 매개변수로 전달됩니다. 따라서 함수에서 검사가 완료되고 테스트에서 반환된 부울 값에 매개변수 개수가 곱해지지 않습니다. 이는 테스트가 참이면 0을 반환하고 거짓이면 0이 아닌 값을 반환하기 때문에 작동합니다. 따라서 해당 숫자의 역수를 곱하면 올바른 개수가 제공됩니다....**

여기서 고려해야 할 마지막 요소는 쉘이 산술을 처리하는 방식입니다. 대부분의 경우 하위 쉘에서 변수 정의를 그렇게 쉽게 전달할 수는 없지만 산술 평가를 사용하면 실제로 그렇게 되기 때문입니다 eval. 이 두 호출은 count_glob결국 다음과 같은 명령문을 인쇄하게 됩니다.

$(((c=[num])+(h=[num])+-2))

...그리고 쉘은 후속 호출에 대해서도 이러한 번호를 존중하고 할당합니다. 프롬프트가 표시되면 이를 테스트할 수 있습니다. 이렇게 하면 echo "$h" "$c"매번 프롬프트에서 보고되는 동일한 값을 얻게 됩니다. 나는 이것이 다른 일에도 유용할 것이라고 생각했습니다.

관련 정보