我遇到了一个似乎无法解决的问题。当我在 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
这样就可以缩小垃圾所在的区域,然后您就可以集中搜索了。