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

予想通り、このような結果が出ました。しかし、2番目は次のとおりです。

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ですが、最後の数字ではありません/」を意味します。

関連情報