有一条线~/.profile
是
PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
我不确定最后一个i
。
- 我应该删除它吗?
- 这不是语法错误吗?
$PATH
环境变量的,但是它们根本不是重复的。最多,它们是相关的。这个问题是在分配环境~/.profile
的行中恰好是一个额外的字符的$PATH
问题。
PATH=
一行~/.profile
看起来应该是有效的–这才是真正的问题。
有一条线~/.profile
是
PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
我不确定最后一个i
。
$PATH
环境变量的,但是它们根本不是重复的。最多,它们是相关的。这个问题是在分配环境~/.profile
的行中恰好是一个额外的字符的$PATH
问题。
PATH=
一行~/.profile
看起来应该是有效的–这才是真正的问题。
Answers:
不,这不是语法错误;这只是扩展后的字母$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
。
我认为以下表达的含义不清楚:
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中可能看起来有所不同,在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/
。
/etc/skel/.profile
在16.04中看起来有所不同,未经测试是否"$HOME/bin"
存在。即使那是一个更好的变体(IMO),它似乎也已在17.10中更改过-是出于某种原因或出于错误。