Вопрос или проблема
В моем $PATH
есть папка ~/.zsh/bin
, которую я использую для небольших скриптов и пользовательских исполняемых файлов. Например, я добавил недавно скомпилированный инструмент, который я сделал, под названием wercker_build_status
, в эту папку. Но когда я ввожу в командной строке wercker_build_status
, он не может его найти; мне нужно ввести полный путь к файлу ~/.zsh/bin/wercker_build_status
.
Это не значит, что ничего в папке не работает, у меня есть скрипт под названием wifi_status
, и вводя его в командной строке, я получаю статус wifi, как и ожидалось.
Почему, хотя он находится в моем $PATH
, я не могу просто использовать файл, который я добавляю в папку ~/.zsh/bin
?
Используйте $HOME
в вашем пути вместо тильды (~
), особенно если вы заключаете новый PATH
в двойные кавычки. Тильда не расширяется, когда она находится в кавычках.
Тестирование:
$ mkdir "$HOME/t"
$ cat >"$HOME/t/foo" <<END
#!/bin/sh
echo "hello"
END
$ chmod +x "$HOME/t/foo"
$ PATH="$PATH:~/t"
$ foo
zsh: command not found: foo
$ PATH="$PATH:$HOME/t"
$ foo
hello
См. также: Почему тильда (~) не расширяется внутри двойных кавычек?
Я только что заново загрузил свой файл .zshrc
. ZShell должен строить свой собственный список и, по-видимому, не делает этого в некоторых ситуациях:
source ~/.zshrc
Ответ или решение
Когда вы сталкиваетесь с проблемами доступа к бинарным файлам, расположенным в папке, которая добавлена в переменную окружения $PATH
, может возникнуть несколько причин, по которым команда не распознается. В вашем случае, несмотря на наличие папки ~/.zsh/bin
в вашем $PATH
, команда wercker_build_status
не срабатывает без указания полного пути. Рассмотрим основные возможные причины этой проблемы и их решения.
Причины проблемы
-
Неверное использование символа тильды (
~
) в переменной$PATH
:
Символ~
(параметр, указывающий на домашнюю директорию пользователя) не всегда корректно интерпретируется, особенно если вы используете кавычки. Если вы добавляете путь к переменной$PATH
с использованием двойных кавычек, тильда не будет развернута. Например:export PATH="$PATH:~/zsh/bin"
В этом случае
~/zsh/bin
будет восприниматься как строка, а не как путь к папке. Вместо этого лучше использовать:export PATH="$PATH:$HOME/.zsh/bin"
-
Неправильные права на исполняемый файл:
Убедитесь, что ваш бинарный файлwercker_build_status
имеет разрешение на выполнение. Для этого выполните следующую команду:chmod +x ~/.zsh/bin/wercker_build_status
-
Обновление окружения после изменений:
Если вы изменили файл конфигурации~/.zshrc
или добавили что-то новое в$PATH
, вам нужно обновить окружение. Сделать это можно с помощью команды:source ~/.zshrc
Это гарантирует, что ваша текущая сессия терминала обновит значение переменной
$PATH
. -
Кэширование исполняемых файлов:
В некоторых случаях Zsh может кэшировать пути к исполняемым файлам, поэтому рекомендуется перезапустить терминал или выполнить команду обновления. -
Неправильный порядок в
$PATH
:
Порядок папок в переменной$PATH
имеет значение. Если в$PATH
указаны другие папки, и там есть файл с таким же именем, система может выбрать его, игнорируя ваш. Убедитесь, что~/.zsh/bin
стоит на первом месте в вашем$PATH
.
Практическое решение
-
Откройте файл
~/.zshrc
и убедитесь, что путь добавлен корректно:export PATH="$HOME/.zsh/bin:$PATH"
-
Проверьте права доступа к файлу:
chmod +x ~/.zsh/bin/wercker_build_status
-
Обновите настройки терминала:
source ~/.zshrc
-
Проверьте работоспособность:
wercker_build_status
Заключение
Проблема, с которой вы столкнулись, скорее всего, связана с неправильным использованием тильды, отсутствием прав на исполнение файла или необходимостью вручную обновить конфигурацию оболочки. Убедитесь, что все вышеперечисленные шаги выполнены, и ваша команда должна начать работать корректно. Если проблема сохраняется, рекомендуется проверить наличие ошибок в файлах внутренних скриптов или другие факторы, которые могут мешать нормальной работе.