Исправление установки пути в файле ~/.profile

Есть строка в ~/.profile который

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Я не уверен насчет последнего i,

  • Должен ли я удалить это??
  • Разве это не ошибка синтаксиса?

3 ответа

Решение

Нет, это не синтаксическая ошибка; это просто письмо, которое добавляется после расширения $PATH, потому что оболочка удаляет кавычки...

$ PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
$ echo $PATH
/home/zanna/bin:/home/zanna/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bini

Таким образом, помимо добавления локальных каталогов, он эффективно удаляет существующие /snap/bin из моего PATH, и добавил несуществующий /snap/bini,

Вы можете удалить i восстановить ваш путь.

Чтобы увидеть изменения, вам нужно выйти из системы и снова войти или запустить source ~/.profile в любой оболочке, которую вы используете (или запустите оболочку с bash -l), так как .profile читается только логинами.

Если вы не внесли это изменение в свой .profile самостоятельно, вы можете восстановить файл по умолчанию, запустив

mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile

Это переименовывает старый .profile.profile.old (вы также можете удалить файл, если хотите) и заменить его версией по умолчанию для вашей системы из /etc/skel,

Да, это синтаксическая ошибка, фактическая .profile должен выглядеть следующим образом, если вы не изменили ситуацию (это версия 17.10, см. примечания под ней):

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Это может выглядеть иначе в старых версиях Ubuntu, где проверка, если пользователи bin каталог присутствует не был включен в .profile, Самый простой способ проверить, как это должно выглядеть - взглянуть на /etc/skel/.profile,

Таким образом, чтобы добавить, как вы просили в своем комментарии, просто поместите это в конец вашего профиля:

# Manual addition for swift development snapshot
export PATH="$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin"

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

Я думаю, что здесь неясно, что означает следующее выражение:

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

Первая часть PATH= означает, что мы присваиваем новое значение переменной (environment) $PATH,

Вторая часть - это новое значение этой переменной. В текущем случае переменная $HOME будет расширен с его текущим значением и к этому значению будет добавлена ​​строка /bin:, То же самое относится и к следующей части строки $HOME/.local/bin:, Наконец текущее (предыдущее) значение $PATH переменная будет расширена и добавлена. Толстая кишка : играет роль разделителя в PATH выражение.

Цель в конечном итоге написать: PATH=<some additional paths>+<the the current value of $PATH>, Мы помещаем эти дополнительные пути перед строкой, потому что мы хотим, чтобы оболочка искала исполняемые файлы сначала в этих местах, а затем в масштабе всей системы.

Характер i не нужно Будет добавлено новое значение $PATH и сделает беспорядок, как объясняет @Zanna в своем ответе.

Другие вопросы по тегам