在~/.profile文件中更正路径设置

~/.profile中有一行代码。
PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

我对最后一个不太确定。
  • 我应该把它删除吗?
  • 这不是语法错误吗?

4@dessert 我不确定这是一个重复的问题。我同意两个问题都涉及到$PATH环境变量,但它们并不完全相同。最多可以说它们有关联。这个问题是关于~/.profile中的一个问题,只是在分配$PATH环境变量的那一行多了一个字符而已。 - Dan
@Dan еңЁйҮҚеӨҚзҡ„й—®йўҳдёӯпјҢеҫ—зҘЁжңҖй«ҳ(!)зҡ„зӯ”жЎҲи§ЈйҮҠдәҶ~/.profileдёӯзҡ„PATH=иЎҢеә”иҜҘжҳҜд»Җд№Ҳж ·зҡ„жүҚиғҪжңүж•Ҳ - иҝҷжүҚжҳҜзңҹжӯЈзҡ„й—®йўҳжүҖеңЁгҖӮ - dessert
1@dessert 这里的OP所拥有的是完全有效的,这不是一个无效格式的问题。它可以工作,只是没有任何有用的功能。 - terdon
你使用 vim 吗?有人建议 i 可能是在你仍然处于插入模式时尝试进入插入模式,因此插入了一个 i - dessert
Zanna说这不是语法错误,但是它是因为解释了'i'可以附加在路径末尾的事实。Zanna的整个回答意味着这是语法错误。 - Smile
2是的,我使用 vi 编辑器。可能我不小心把'i'放入文件中,就像 dessert 说的那样。但后来我必须输入 :wq 命令以使其生效。我认为我没有这样做,但考虑到我的水平,我可能做了一些愚蠢的事情。 - Smile
3个回答

不,这不是语法错误;这只是在$PATH扩展后附加的一个字母,因为shell会移除引号...
$ 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

所以,除了在本地目录前添加之外,它还有效地从我的PATH中删除了现有的/snap/bin,并添加了不存在的/snap/bini。
您可以删除i来修复您的PATH。
要查看更改,您需要注销并重新登录,或在您使用的任何shell中运行source ~/.profile(或使用bash -l启动shell),因为.profile仅由登录shell读取。
如果您没有自己对.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/目录下找到备份,从中获取一个新的个人资料。

1我多了一行额外的代码 "export PATH=$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin" 是因为我安装了它。这样可以吗? - Smile
3这一行没问题,我把它包含在我的示例中,以展示放置的位置。 - Videonauth
1请注意,16.04版本中的/etc/skel/.profile文件看起来不同,没有检查"$HOME/bin"是否存在。即使这也许是一种更好的变体(我个人认为),但似乎在17.10版本中被改回去了 - 不管是出于某种原因还是误操作。 - Gunnar Hjalmarsson
@GunnarHjalmarsson会在我的帖子中注意到,是的,这是我正在运行的17.10版本的skel/.profile。 - Videonauth

我觉得这里不太清楚下面这个表达的意思。
PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

第一部分PATH=表示我们给(环境)变量$PATH赋予一个新值。
第二部分是该变量的新值。在当前情况下,变量$HOME将会扩展为其当前值,并在该值后附加字符串/bin:。对于字符串的下一部分$HOME/.local/bin:也是如此。最后,将扩展并附加当前(先前)$PATH变量的值。冒号:PATH表达式中起到分隔符的作用。
最终目标是编写:PATH=<一些附加路径>+<$PATH的当前值>。我们将这些附加路径放在字符串的前面,因为我们希望shell首先在这些位置搜索可执行文件,然后再搜索系统范围内的。
字符i是不必要的。它将被附加到$PATH的新值上,并且会造成混乱,正如@Zanna在她的回答中解释的那样。