Bash 스크립트 분할 오류

Bash 스크립트 분할 오류

나는 디렉터리를 읽고 그 안에 있는 모든 파일(모든 하위 디렉터리 포함)의 파일 형식을 반환하는 bash 스크립트를 작성하는 임무를 맡았습니다. find 명령은 허용되지 않습니다. 이를 달성하기 위해 두 개의 for 루프를 사용해 보았지만 분할 오류가 발생했습니다. 그러나 하위 디렉터리 없이 디렉터리를 전달할 때 스크립트가 작동하는 것을 발견했습니다. 멍청한 놈의 코드를 보고 무엇이 잘못되었는지 말해 줄 사람이 있을까요? 매우 감사합니다.

#!/bin/bash
func () {
for name in $1
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$1"
  fi
done
}

directory="$1/*"
for name in $directory
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$1"
  fi
done

답변1

처리 중인 " "이 디렉터리 인 경우 원래 인수가 아닌 해당 내용 $name으로 호출해야 합니다 . 그렇지 않으면 무한 루프가 발생하여 세그폴트가 발생합니다.func

원래 매개변수에 함수를 사용하고 해당 함수를 각 항목에 개별적으로 적용하면 코드를 크게 줄일 수 있습니다. 어쨌든, 이제 신체 기능에서 일어나는 일의 대부분을 반복하고 있습니다.

#!/bin/bash
func () {
    local arg="$1"
    if [[ -f "$arg" ]] ; then
        file -- "$arg"
        return
    fi
    if [[ -d "$arg" ]] ; then
        for file in "$arg"/* ; do
            func "$file"
        done
    fi
}

func "$1"

답변2

bash 기능에 액세스할 수 있는 경우 가장 쉬운 방법은 해당 기능을 활성화 globstar하고 사용하는 것입니다.

shopt -s globstar
for f in "$1"/**; do 
    if [ -f "$f" ]; then 
        file -- "$f"
    fi
done

원래 스크립트의 논리를 사용하면 올바른 입력을 제공할 수 있습니다.

#!/bin/bash
func () {
for name in "$1"/*
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$name"
  fi
done
}

directory="$1"
for name in "$directory"/*
do
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$name"
  fi
done

func $1대신 사용 중이 func $name어서 무한 루프에 들어가 세그폴트가 발생했습니다. 다음에 하나를 추가하여 echo작업 중인 내용을 확인하면 즉시 오류가 표시됩니다.

또한 실제로 이와 같은 코드를 반복할 필요는 없습니다. 함수의 전체 요점은 이러한 중복을 피하는 것이므로 간단히 다음과 같이 할 수 있습니다.

#!/bin/bash
func () {
for name in "$1"/*
do
  echo "FF $name"
  if [ -f "$name" ]
  then
    file "$name"
  elif [ -d "$name" ]
  then
    func "$name"
  fi
done
}

directory="$1"
for name in "$directory"/*
do
  func "$name"
done

관련 정보