每次我打开 shell,终端上的第一行都是“bash: n: 未找到命令”。我尝试查看 /etc/profile、~/.bashrc、~/.profile 和 ~/.bash_profile,但找不到那个“n”(我猜是某个地方打错了?)来自哪里。因此,我运行命令bash -x -l
并生成以下输出:
++ [[ -n 5.2.26(1)-release ]]
+++ declare -p PROMPT_COMMAND
++ [[ bash: declare: PROMPT_COMMAND: not found =~ declare -a ]]
++ PROMPT_COMMAND=__vte_prompt_command
+++ printf '\033]777;preexec\033\'
++ PS0=''
++ return 0
+ for i in /etc/profile.d/*.sh /etc/profile.d/sh.local
+ '[' -r /etc/profile.d/which2.sh ']'
+ '[' mxBH '!=' himxBH ']'
+ . /etc/profile.d/which2.sh
++ case "$(basename $(readlink /proc/$$/exe))" in
++++ readlink /proc/148743/exe
+++ basename /usr/bin/bash
++ alias 'which=(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'
+ for i in /etc/profile.d/*.sh /etc/profile.d/sh.local
+ '[' -r /etc/profile.d/sh.local ']'
+ '[' mxBH '!=' himxBH ']'
+ . /etc/profile.d/sh.local
+ unset i
+ unset -f pathmunge
+ test /usr/bin/bash
+ n test -z ''
+ local runcnf=1
+ local retval=127
+ [[ himxBH == *\i* ]]
+ [[ ! -S /run/dbus/system_bus_socket ]]
+ [[ ! -x /usr/libexec/packagekitd ]]
+ [[ -n '' ]]
+ [[ ! -x /usr/libexec/pk-command-not-found ]]
+ '[' 1 -eq 1 ']'
+ /usr/libexec/pk-command-not-found n test -z ''
bash: n: command not found...
+ retval=127
+ return 127
+ PT8HOME=/opt/pt
+ export PT8HOME
+ '[' -f /home/alessandro/.bashrc ']'
+ . /home/alessandro/.bashrc
++ '[' -f /etc/bashrc ']'
++ . /etc/bashrc
+++ '[' -z '' ']'
+++ BASHRCSOURCED=Y
+++ '[' '\s-\v\$ ' ']'
+++ '[' -z __vte_prompt_command ']'
+++ shopt -s histappend
+++ shopt -s checkwinsize
+++ '[' '\s-\v\$ ' = '\s-\v\$ ' ']'
+++ PS1='[\u@\h \W]\$ '
+++ shopt -q login_shell
++ PS1='[\[\033[1;35m\]\u\[\033[0m\]@\h \W]\$ '
++ [[ /home/alessandro/.local/bin:/home/alessandro/bin:/usr/lib64/ccache:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin =~ /home/alessandro/\.local/bin:/home/alessandro/bin: ]]
++ '[' -d /home/alessandro/.bashrc.d ']'
++ unset rc
++ alias 'll=ls -lhtr'
++ alias 'ccomp=clang -std=c11 -Wall -Wextra'
++ alias '..=cd ..'
++ __vte_prompt_command
+++ HISTTIMEFORMAT=
+++ history 1
+++ sed 's/^ *[0-9]\+ *//'
++ local 'command=bash -x -l >> logs.txt'
++ command='bash -x -l >> logs.txt'
++ local 'pwd=~'
++ '[' /home/alessandro '!=' /home/alessandro ']'
++ pwd='~'
++ printf '\033]777;notify;Command completed;%s\033\\\033]777;precmd\033\\\033]0;%s@%s:%s\033\\' 'bash -x -l >> logs.txt' alessandro fedora '~'
++ __vte_osc7
+++ /usr/libexec/vte-urlencode-cwd
++ printf '\033]7;file://%s%s\033\' fedora /home/alessandro
这实际上只是输出的最后一部分,但您可以看到中间部分有错误“bash:n:未找到命令...”。问题是我无法读取该输出。我只知道加号表示脚本执行的深度。 那么,您能通过阅读输出了解错误来自何处吗?
找出给定命令来自哪个源文件的一个技巧是进行修改
PS4
以在 xtrace 输出中包含源文件名和行。(请参阅此处和此处。)例如,使用类似以下命令运行 shell在评论中,您显示了以下行,如果它确实与这里完全一样,带有文字反斜杠,那么它将解释该问题:
在 Bash 中,不带引号的
\n
和 一样n
。反斜杠会删除后面字符的任何特殊含义,并且本身也会被删除。虽然没有n
特殊含义,但反斜杠仍然会被删除。如果带引号,情况会有所不同,"\n"
会导致出现反斜杠和n
。这里,
\n
格式字符串中的"%s\n"
被 printf 变成了换行符,其余部分则按照 shell 处理后的结果打印出来。但是引号的形式
$'...'
不同,\n
在 printf 看到它之前,它会作为 shell 处理的一部分变成换行符。(printf 会处理格式字符串的反斜杠转义,但不会处理用 打印的字符串
%s
。)所以
&&\n test -z ...
与 相同&& n test -z ...
,这应该可以解释错误。如果你想
&&
在一行中有一个链条,你可以不用任何额外的操作来实现它,即或者,如果您想将其拆分为多行,您只需在运算符后使用换行符即可
&&
:如果您需要在其他任何位置分割该行,则需要在行的最末尾放置一个反斜杠(其后没有空格),例如:
在详细输出中,有一行
这可能是出现该错误消息的原因。
您显然搜索了所有标准
bash
启动文件,但一无所获。下一步是查看这些启动文件中是否有任何文件,可能是刚好位于错误线的上方
n
。