bash 终端启动时未找到乱码命令

bash 终端启动时未找到乱码命令

我遇到了一个似乎无法解决的问题。当我在 ubuntu (14.04) 中启动终端时,我收到以下消息

sdfsdfsdi: command not found

正如您所看到的,这看起来就像有人(可能是我自己)在沮丧地敲打键盘,然后不小心写入了 bash 在初始化时读取的某个脚本。问题是,当 bash 遇到这种乱码时,我无论如何也找不到它正在读取什么脚本。我查看了

~/.profile
~/.bashrc
~/.bash_profile
/etc/profile
/etc/bash.bashrc

并且它们似乎都没有乱码短语。 还有其他我可以检查的启动时 bash 读取的位置吗?

谢谢!

安德鲁

(请注意,这不是一个严重问题,只是一个小麻烦)。

答案1

bash要查找启动时运行的命令以及这些命令来自哪个文件,请运行:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

输出很长但希望乱码的来源是清楚的。

解释:

  • PS4='+$BASH_SOURCE> '

    当创建执行跟踪时,bash将在每行前面添加扩展名PS4。在这里,我们PS4显示正在读取的源文件。

  • BASH_XTRACEFD=7

    这会将执行跟踪发送到7所选的文件描述符,希望bash启动文件不会干扰该文件描述符。

  • bash -xl

    这将使用选项 启动 bash -x,这会导致所有命令都与提示符一起显示PS4,并-l指​​示bash将其视为登录 shell。如果您在登录 shell 上没有看到乱码,请尝试不使用-l

  • 7>&2

    这会将跟踪输出重定向回 stderr 以便在终端上显示。

三个改进

根据 Geirha 的评论,此版本增加了三项改进:

PS4='+ $BASH_SOURCE:$LINENO:' BASH_XTRACEFD=7 bash -xlic ""  7>&2

这里有三个改进:(1)PS4 提示现在还显示行号和文件名,(2)该-i标志使 shell 具有交互性,此外还-l使其成为登录 shell,(3)-c ""在初始化完成后导致 shell 退出。

答案2

它具有侵入性,但您可以使用书中最古老的调试技术:打印内容来标记出错的地方:

sudo tee -a /etc/profile <<<'echo /etc/profile'
sudo tee -a /etc/bash.bashrc <<<'echo /etc/bash.bashrc'
tee -a ~/.profile <<<'echo ~/.profile'
tee -a ~/.bashrc <<<'echo ~/.bashrc'
tee -a ~/.bash_aliases <<<'echo ~/.bash_aliases'
bash -l

这样就可以缩小垃圾所在的区域,然后您就可以集中搜索了。

相关内容