Shell script: плохой интерпретатор: нет такого файла или каталога при использовании pwd

Я хочу просмотреть файлы в каталоге с циклом for, но это происходит.

echo: bad interpreter: No such file or directory

код:

#!/bin/bash
count=0
dir=`pwd`
echo "$dir"
FILES=`ls $dir`
for file in $FILES
do
 if [ -f $file ]
 then
  count=$(($count + 1))
 fi
done
echo $count

Ответ 1

Лучше сделать:

#!/bin/bash
count=0
dir="$PWD"
echo "$dir"

for file in "$dir"/*
do
 if [[ -f $file ]]
 then
  ((count++))
 fi
done
echo $count

или простейшее/кратчайшее решение:

#!/bin/bash

echo "$PWD"

for file; do
 [[ -f $file ]] && ((count++))
done

echo $count

Ответ 2

У меня была та же проблема. Удаление #!/bin/bash сделало трюк для меня. Похоже, что нет необходимости добавлять, где находится bash, так как оно находится на пути к системе.

Я нашел другое решение здесь. Изменение

#!/bin/bash

для

#!/usr/bin/bash

Ответ 3

echo: bad interpreter: No such file or directory, скорее всего, из первой строки, #!... которая называется строкой Шебанга.

О линии #!...

Эта строка указывает оболочке, какой интерпретатор использовать для запуска файла. Это может быть, например, bash или sh (который (приблизительно) является подмножеством, поэтому многие вещи не будут работать), или в основном все, что может выполнять содержимое файла - Perl, Python, Ruby, Groovy...

Строка указывает системе в тех случаях, когда вы вызываете скрипт напрямую, когда он исполняется:

./myScript.sh

Он также часто используется редакторами для распознавания правильной подсветки синтаксиса, когда файл не имеет суффикса - например, Gedit делает это.

Решение

Чтобы переопределить строку, передайте скрипт в Bash в качестве параметра:

bash myScript.sh

Или, вы можете "найти" его, что означает, изнутри оболочки Bash, сделать любой из

source myScript.sh
. myScript.sh

который будет работать (примерно), как если бы вы вставили команды самостоятельно.

Ответ 4

В моем случае сценарий bash был создан на ПК с Windows, который добавлял символ возврата каретки перед каждым переводом строки. \x0D\x0A вместо просто \x0A. Я заменил все CRLF только на LF, используя sed и мой скрипт теперь работает.

sed -i 's//\r/\n//\n/g' /path/to/file.sh

Ответ 5

Это странная ошибка. Я рекомендую попробовать найти источник ошибки.

Одна вещь - проверить команду pwd.

type pwd

Убедитесь, что /usr/bin/pwd или/bin/pwd, и не проверяйте его script:

file /usr/bin/pwd

Если это script, я уверен, он начинается с

#!echo

Ответ 6

Я только что столкнулся с той же проблемой и обнаружил, что моя ошибка была в моей первой строке, имея

#!bin/bash

вместо

#!/bin/bash

Ответ 7

Если вы использовали Homebrew для установки BASH,

Удаление #!/bin/bash будет достаточно.

Ответ 8

Вы можете найти, где bash находится с помощью команды

whereis bash

и вы можете скопировать путь bash к пути, в котором вы видите ошибку плохого интерпретатора.

Ответ 9

Я следовал инструкциям по следующей ссылке, и проблема была решена.

Ссылка: ошибка скрипта - плохой интерпретатор На самом деле в конце каждой строки был дополнительный символ ^ M. Так что, после удаления это работало нормально для меня.

Надеюсь, поможет!