“没有这样的文件或目录”是如何添加到我的 PATH 变量中的?

“没有这样的文件或目录”是如何添加到我的 PATH 变量中的?

今天我注意到我的路径No such file or directory在末尾有一个入口,这导致了其他问题。

我的路径如下所示:/home/geneorama/gems/bin:/home/geneorama/anaconda3/bin:/home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory

我不知道添加了什么,想知道如何排除故障。

我检查了一下.bashrc,没有发现任何问题。.bashrc正如预期的那样添加了 anaconda 和 Ruby。

基于这个很好的答案关于如何设置 PATH,我检查了我的~/.profile文件。配置文件脚本只运行 .bashrc,并将$HOME/bin和添加$HOME/.local/bin到路径中。这些路径只有在存在时才会添加,而且确实存在。

我读了我能理解的内容man login。这让我检查了/etc/login.defs,但看起来非常普通。我没有登录帮助中提到的任何其他文件。

有什么想法可以解决发生这种情况的地方吗?

编辑:2021 年 1 月 11 日

根据评论,我编辑了问题以表明我已经检查过了~.profile

我还制作了一个非常简单的版本~.bashrc,重新启动,并使用调试命令运行 bash。PATH仍然损坏。

geneorama@computer:~$ bash -x ~/.bashrc
+ HISTCONTROL=ignoreboth
+ shopt -s histappend
+ HISTSIZE=9999999
+ HISTFILESIZE=999999999
+ shopt -s checkwinsize
geneorama@computer:~$ $PATH
bash: /home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory

编辑:2021 年 1 月 11 日(今天第二次编辑)

我还注意到,我无法通过手动设置路径或以 root 身份登录来修复错误。我尝试使用export带引号的字符串来设置路径(我不知道这是否重要或是否是最好的方法)。

geneorama@computer:~$ $PATH
bash: /home/geneorama/gems/bin:/home/geneorama/anaconda3/bin:/home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory
geneorama@computer:~$ PATH="/home/geneorama/gems/bin:/home/geneorama/anaconda3/bin:/home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
geneorama@computer:~$ $PATH
bash: /home/geneorama/gems/bin:/home/geneorama/anaconda3/bin:/home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: No such file or directory
geneorama@computer:~$ sudo su -
[sudo] password for geneorama: 
root@ativ4-v18:~# $PATH
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory
root@ativ4-v18:~# logout
geneorama@computer:~$ export PATH=/home/geneorama/gems/bin:/home/geneorama/anaconda3/bin:/home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
geneorama@computer:~$ $PATH
bash: /home/geneorama/gems/bin:/home/geneorama/anaconda3/bin:/home/geneorama/.local/bin:/home/geneorama/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: No such file or directory

还查看了/etc/environment//etc/environment.d/。第一个是空的,第二个有两个文件90atk-adaptor.conf90qt-a11y.conf,但它们似乎没有影响路径。

编辑:2021 年 1 月 11 日(今天第三次编辑)

即使我手动将路径设置为 just ,我/sbin还是/bin会收到错误。此时我不明白错误消息是否真的出现在我的路径上,还是随路径一起打印。

geneorama@computer:~$ export PATH=/sbin:/bin
geneorama@computer:~$ $PATH
bash: /sbin:/bin: No such file or directory

编辑:2021 年 1 月 12 日

最初我在 Jekyll 中遇到了错误。一些网站说我的错误是由 中的空格引起的$PATH。当我(错误地)打印我的时$PATH,我认为有东西试图添加我已删除的路径。我以为我错误地卸载了某些东西。

打印的空格是错误消息的一部分,而不是 的一部分$PATH

显然 Jekyll 已损坏,解决方法是apt remove删除它然后重新安装。

在此过程中,我了解到路径变量可以通过许多不明显的方式进行修改。我的问题的答案本质上是“正确打印你的 $PATH”。

有一天,有人可能会问“如何调试/分析对我的 $PATH 的编辑?”,有人可能会将其标记为重复。它不是这个问题的重复。这个问题原来是“如何打印 $PATH”。

答案1

问题不在于你的PATH,而在于你试图显示它的方式。命令行中的第一件事是您正在运行的命令。如果你只是输入$PATH,shell 将尝试将您的PATH作为命令运行,但它不是一个命令——它是一个冒号分隔的目录列表,用于在其中查找命令。由于没有该名称的实际命令,因此您会收到错误。(并且因为它正在寻找可执行文件文件对应于该命令,您收到的错误是“没有这样的文件或目录”)。

要正确显示 shell 变量的值PATH,请使用 eg echo "$PATH"(或者如果它可能包含反斜杠/转义符,则改用printf '%s\n' "$PATH")。有时可以省略变量引用周围的双引号,但并非总是如此,因此养成使用双引号括住变量引用的习惯更安全。我的意思是总是,而不仅仅是在echo命令中。请参阅这里这里, 和这里了解更多解释。

具体来说PATH,如果将其分成单独的目录,通常更容易看到它;您可以使用命令tr将冒号分隔符转换为换行符。比较以下两个示例:

$ echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

$ echo "$PATH" | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/local/games
/usr/games

答案2

您如何显示 $PATH?使用

echo $PATH

并且您不应该看到错误消息。如果您使用类似

ls $PATH

最后你会得到这样的错误。

您的 PATH 没有任何问题。但是目录字符串不是文件,如果您将其视为文件(尝试通过键入 $PATH 来执行它或尝试使用 ls $PATH 查看它,您将收到它不是文件的错误。

相关内容