Bash: "잘못된 해석기: 너무 많은 심볼릭 링크 수준" 오류

Bash: "잘못된 해석기: 너무 많은 심볼릭 링크 수준" 오류

나는 거의 항상 루트이기 때문에 최근에 권한 722로 bash 실행 파일을 만들었습니다. 파일의 내용은 다음과 같습니다.

#!/home/nolan/Documents/test/listFiles

[ $# -lt 1 ] && dirFocus = "" || dirFocus = $1
dirSize=$(ls -a $dirFocus | wc -w)

for ((a = 1; a <= $dirSize; a++)) ; do
    i = 1
    for ITEM in $(ls -a $dirFocus); do
        declare -i i
        declare -i a
        if [ $a -eq $i ]; then
            echo "$a : $ITEM"
        fi
        i = $[ $i + 1 ]
    done
done

터미널에서 실행할 때 다음을 사용하십시오.

root @ /home/nolan/Documents/test: bash listFiles
1 : .
2 : ..
3 : apple
4 : dirCheck
5 : ifTest
6 : ifTest.txt
7 : listFiles
8 : myscript
9 : nolan.txt
10 : pointer_to_apple
11 : scriptx.sh
12 : Stuff
13 : weekend
14 : weekend2
15 : weekend3

예상대로 이런 결과가 나왔습니다. 그러나 두 번째는 다음과 같습니다.

root @ /home/nolan/Documents/test: ./listFiles
bash: ./listFiles: /home/nolan/Documents/test/listFiles: bad interpreter: Too
many levels of symbolic links

내가 얻는 오류입니다. 정확히 무엇이 잘못되었나요? 다른 포럼을 확인해 보았지만 내 상황에 맞지 않는 것 같습니다.

답변1

스크립트의 첫 번째 줄은 "shebang" 줄입니다. 스크립트를 해석하기 위해 실행할 프로그램을 커널(프로그램 로더)에 알려줍니다. 스크립트는 스크립트를 해석하기 위해 자체 실행을 시도하고, 스크립트는 다시 인터프리터를 해석하기 위해 자신을 호출합니다.

run script 를 사용하면 bash filename커널이 호출되지 않지만 bash는 유효한 스크립트를 실행하는 데 사용됩니다.

놓다

#! /bin/bash

첫 번째 줄로 가면 모든 것이 잘 될 것입니다.

그런데, 시스템을 실험할 수 있는 제한된 권한을 가진 사용자를 만드세요. 왜냐하면 root수리할 수 없는 것은 무엇이든 쉽게 파괴할 수 있기 때문입니다.

답변2

쵸로바가 설명을 너무 잘했네문제는 쉘 스크립트가 bash.

다음은 스크립트 재구현에 대한 제안입니다.

  1. 구문 오류가 포함되어 있지 않습니다( dirFocus = ""예: =할당에 공백이 없어야 하는 구문 오류).

  2. 공백과 개행 문자가 포함된 파일 이름을 처리합니다. 출력을 반복하면 ls해당 파일 이름이 부적격해지고 wc -w파일 이름에 공백이 포함된 경우 잘못된 개수가 계산됩니다.

  3. 최신 쉘 구문( $[ $i + 1 ]사용되지 않는 bash구문)을 사용하십시오.

  4. 소개하다매우 작은출력 개선( (dir)디렉토리 이름에 추가됨)

#!/bin/bash

shopt -s dotglob    # make wildcards match hidden names by default
shopt -s nullglob   # make wildcards expand to nothing if no match

count=0
for name in "${1:-.}"/*; do
    count=$(( count + 1 ))
    if [ -d "$name" ]; then
        printf '%d : %s (dir)\n' "$count" "${name##*/}"
    else
        printf '%d : %s\n' "$count" "${name##*/}"
    fi
done

이는 또한 파일 목록을 여러 번 확장하지 않는 반면, 코드는 ls디렉터리의 각 이름에 대해 전체 디렉터리를 확장합니다.

${1:-.}"비어 있거나 설정되지 않은 경우에는 그 안에 있는 내용을 사용하십시오 . $1이 경우에는 사용하십시오 ."를 의미합니다.

${name##*/}"의 문자열 $name이지만 마지막 숫자는 아님 /"을 의미합니다.

관련 정보