7 лет спустя :та же проблема -то же неполное сообщение об ошибке Сбой на «файл не найден», но не указана цель

Единственная проблема, которую я вижу, это отсутствие кавычек, так что если в именах каталогов/файлов есть пробелы, это пойдет не так.

#!/bin/bash

current_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
mkdir -p "$current_path/class"
cd "$current_path/class"
if [ -f "$1.php" ];
then
   exit 1
else
   echo "class $1
{
}" > "$1.php"
fi

Существует также проблема использования "$@", это то, что вы хотели. Вы имели в виду "$*"?

и имена переменных должны быть в нижнем -регистре. Я не вижу, как это вызовет проблему здесь, но это ошибка, ожидающая своего появления.

Запуск shellcheckобнаружил бы большинство этих ошибок.

2
25.01.2021, 19:58
1 ответ

No such file or directory— это сообщение об ошибке, связанное с кодом ошибки ENOENT.

Это сокращение от Error NO ENTry , обычно связанное с тем фактом, что в каталоге не было записи с данным именем, но также часто используется для обозначения не существует , даже если это не относится конкретно к данному файлу.

В качестве альтернативы иногда используется ESRCH. Это Error SeaRCH , но соответствующее сообщение об ошибке на английском языке обычно No such process, что, в конце концов, еще больше сбивает с толку, если ошибка не связана конкретно с процессами.

В любом случае, в вашем случае ошибка говорит о том, что локаль не найдена. Это может относиться или не относиться к реальному файлу, но это вряд ли имеет значение.

Вот, если я сделаю:

$ LC_ALL=foo locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
$ LC_ALL=foo strace locale 2>&1 | grep ENOENT
openat(AT_FDCWD, "/usr/lib/locale/foo/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/foo/LC_MESSAGES", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/foo/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

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

Для существующей локали я вижу:

$ strace locale 2>&1 | grep /usr/lib/locale
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3

Дополнительные файлы искать не нужно, так как вся информация находится в этом locale-archive.

locale -aсообщит вам список доступных локалей в вашей системе. Если какая-либо из переменных среды LC_*или LANGсодержит что-то, чего нет в этом списке, вы увидите ошибки такого рода.

Способ сделать доступными дополнительные локали зависит от системы.

В Debian это обычно dpkg-reconfigure locales. Как правило, в конечном итоге локали компилируются из исходников с помощью стандартной команды localedef.

2
18.03.2021, 22:34

Теги

Похожие вопросы