Intereting Posts
Новый сигнал поступает, когда выполнение выполняется в обработчике сигналов, как решить, что является первым? Live linux дистрибутив, который включает TrueCrypt, который будет использоваться для восстановления данных Что произойдет, если я удалю все пароли пользователей? Использование pipelight на Fedora? загрузка без сбоев Сделать VIM действующим как Notepad ++ на концы смешанной линии Как найти последние удаленные файлы на OpenSuse? Почему бы не использовать «что»? Что использовать тогда? Повторно включить кеш маршрутов VGA и DVI, установите консоль ядра по умолчанию на один Установлен OpenSSH на Mint 17, но он, похоже, не работает Как отключить Ristretto от запуска, максимизированного всякий раз, когда я дважды щелкните изображение для просмотра? Как запретить пользователям переименование файлов при предоставлении разрешений на запись в Linux Как отобразить все команды unix, доступные в системе? Как «отслеживать» вновь созданные процессы?

Баш: «плохой интерпретатор: слишком много уровней символических ссылок» Ошибка

Недавно я создал исполняемый файл bash с правами доступа 722, поскольку я почти всегда являюсь пользователем root. Содержимое файла выглядит следующим образом:

#!/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 -ii declare -ia 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 

Это ошибка, которую я получаю. Что именно идет не так? Я проверил другие форумы, но они не относятся к моей ситуации.

Первая строка скрипта – это строка «шебанг». Он сообщает ядру (загрузчику программ), какую программу запустить для интерпретации сценария. Ваш сценарий пытается запустить сам себя для интерпретации сценария, который, в свою очередь, вызывает себя для интерпретации интерпретатора и т. Д. До бесконечности.

Когда вы запускаете скрипт с bash filename , kernel ​​не вызывается, а bash используется для запуска скрипта, который работает.

Положил

 #! /bin/bash 

до первой строчки и все будет хорошо.

Кстати, создайте пользователя с ограниченными правами для экспериментов с системой. Как root , вы можете легко уничтожить все, что не подлежит восстановлению.

Чороба очень хорошо объяснил, что ваша проблема в том, что скрипт оболочки использует себя как интерпретатор вместо 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 , но без бита до последнего / ».