В ~/.profile
есть строчка
PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
. Я не уверен насчет последнего i
.
Нет, это не синтаксическая ошибка; это просто буква, которая добавляется после расширения $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
, чтобы восстановить вашу PATH.
Чтобы увидеть изменения, вам нужно будет выйти и снова войти или запустить source ~/.profile
в любой используемой вами оболочке (или запустить оболочку с bash -l
), потому что .profile
читается login только снаряды .
Если вы не внесли это изменение в .profile
самостоятельно, вы можете восстановить файл по умолчанию, выполнив
mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile
Это переименует старую .profile
.profile.old
(вы также можете удалите файл, если хотите) и замените его версией по умолчанию для вашей системы из /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 в своем ответе .
Да, это синтаксическая ошибка, фактический .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, где проверка наличия каталога users 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/
.