更正〜/ .profile文件中的路径设置


11

有一条线~/.profile

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

我不确定最后一个i

  • 我应该删除它吗?
  • 这不是语法错误吗?


4
@dessert我不确定是否重复。我同意两者都是关于$PATH环境变量的,但是它们根本不是重复的。最多,它们是相关的。这个问题是在分配环境~/.profile的行中恰好是一个额外的字符的$PATH问题。
丹丹(Dan)

@Dan重复问题中投票最高的(!)答案说明了其中的PATH=一行~/.profile看起来应该是有效的–这才是真正的问题。
甜点

1
@dessert这里的OP完全正确,这不是格式无效的问题。这行得通,只是没有任何用处。
terdon

2
是的,我使用vi编辑器。可能我不小心将“ i”放在文件中,就像甜点说的那样。但是后来我不得不:wq使它生效。我认为我没有这样做,但是考虑到我的水平,我可能做过一些愚蠢的事情。
微笑

Answers:


13

不,这不是语法错误;这只是扩展后的字母$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在您正在使用的任何shell中运行(或使用来启动shell bash -l),因为.profile它仅由登录shell读取。

如果您自己没有进行此更改.profile,则可能需要通过运行以下命令来还原默认文件:

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

这将重命名旧.profile .profile.old文件(如果需要,您也可以删除文件),并将其替换为系统默认的版本/etc/skel


5

我认为以下表达的含义不清楚:

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在她的回答中解释的那样,它将被附加到的新值上并造成混乱。


5

是的,这是一个语法错误,.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中可能看起来有所不同,在Ubuntu的旧版本中,检查user 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”,原因是我安装了它。可以吗?
微笑

3
这行很好,我将其包含在示例中以显示放置位置。
Videonauth

1
请注意,/etc/skel/.profile在16.04中看起来有所不同,未经测试是否"$HOME/bin"存在。即使那是一个更好的变体(IMO),它似乎也已在17.10中更改过-是出于某种原因或出于错误。
Gunnar Hjalmarsson

@GunnarHjalmarsson将在我的帖子中指出,是的,这是我正在运行的17.10版本的skel / .profile。
Videonauth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.