ls가 출력에서 ​​스크립트와 바이너리를 구별하도록 합니다.

ls가 출력에서 ​​스크립트와 바이너리를 구별하도록 합니다.

ls실행 가능한 스크립트와 실제 컴파일된 바이너리를 구별하는 것이 가능합니까 ?

권한은 일반적으로 동일하며( +x), 둘 다 ls -F별표( *)가 붙어 있어 구별하기 어렵습니다. 색상을 설정하는 스크립트가 있지만 ls파일이 실행 가능한지 여부에 따라 달라지므로 동일하게 나타납니다.

BG='01;32'  # green
EX="ex=$BG" # file with execute permission

많은 파일에 확장 기능이 없기 때문에 확장 기능에 의존하고 싶지 않습니다.

cat이상한 오류 메시지가 표시되고 "이 문제를 일으키는 코드는 무엇입니까?"라고 생각할 때 파일이 안전한지 알 수 있기를 원합니다.

표준 솔루션이 없다면 file공통 함수에서 의 출력을 구문 분석하고 고유한 마크업을 삽입하는 것은 어떻습니까? 아니면 너무 느린가요 ls?

답변1

바이너리와 스크립트를 구별하려면 파일의 내용을 살펴봐야 합니다. ls그렇게 하지 않고 파일 이름과 메타데이터(유형, 권한 등)만 살펴봅니다.

file이것은 스크립트와 바이너리를 다양한 방식으로 색상화하기 위한 대략적인 파서입니다 . 이는 다음과 같이 작동합니다 . 메타데이터를 추가하려면 패치 작업이 필요하며, 이를 위해서는 디렉터리 내용을 나열하는 데 ls -d더 직접적인 방법(예: Perl 또는 Python)이 필요합니다 . lsx somedir/*파일 이름에는 개행이나 콜론이 포함되어 있지 않다고 가정합니다(옵션을 사용하여 :다른 문자열의 구분 기호를 변경할 수 있음).-Ffile

lsx () {
  file -iN -- "$@" |
  while IFS= read -r line; do
    name=${line%%: *}; type=${line#*: }
    color=0
    case $type in
      application/x-executable*) color='32';;
      text/x-shellscript*) color='01;32';;
      application/*zip*) color='31';;
    esac
    printf '\033[%sm%s\033[0m\n' "$color" "$name"
  done
}

답변2

당신은 놀 수 있습니다 dircolors. 출력을 살펴보십시오 dircolors -p. 내 시스템에서 다음과 같은 관련 정의를 찾았습니다.

# This is for files with execute permission:
EXEC 01;32
# Or if you want to colorize scripts even if they do not have the
# executable bit actually set.
#.sh 01;32

#마지막 줄을 제거 하고 .sh 07;31쉘 스크립트(확장자가 있는 모든 파일 .sh)를 작성하면 빨간색으로 깜박입니다.

설정을 저장 ~/.dircolors하고 라인에 추가하세요 .bashrc.

eval "$(dircolor $HOME/.dircolors)"

관련 정보