【问题标题】:Mac terminal error -bash: command not found - El Capitan 10.11.13Mac 终端错误 -bash:找不到命令 - El Capitan 10.11.13
【发布时间】:2016-03-10 21:22:23
【问题描述】:

我第一次打开 Mac 终端时收到一条错误消息 -

-bash: Applications: command not found

奇怪(或者可能不那么奇怪),当我打开另一个标签时,有时会收到不同的错误 -

-bash: README.md: command not found

-bash: [: missing `]'

我今天早上才注意到...我昨晚做的两件事可能导致了这种情况,但我不确定我是否正确,也不知道如何适当地解决这个问题问题。我的操作系统是 El Capitan 10.11.13。

首先,昨晚,我使用 Homebrew 安装 PostGIS 2.2 - 我的 Postgres 版本是 9.5.1。

其次,我为我的一个项目提出了 Github 拉取请求(我不确定拉取请求会如何扰乱我的 bash 个人资料,但 Github 的标准自述文件格式是 README.md,所以我想我最好提一下这里)。

我的 bash 个人资料对我来说似乎很干净 -

[[ -s "$HOME/.profile" ]] && source "$HOME/.profile" # Load the default .profile
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function
export PATH=${PATH}:/usr/local/mysql/bin
*    #EDITED TO INCLUDE THIS ASTERISK, WHICH I NEGLECTED BEFORE

谁能解释发生了什么以及我该如何解决这个问题?我对使用终端相当陌生,所以我不太清楚如何解释。

【问题讨论】:

  • set -x 添加到您个人资料的开头,看看它的作用——准备好被吓到。但它可能会告诉你出了什么问题。如果没有,请将set -x 添加到更多位置。
  • 谢谢 - 当然我不知道如何解释大部分输出,但这两行确实出现在最后: + Applications Desktop Documents Downloads Library Movies Music Pictures Public log.txt bash:应用程序:找不到命令。你的想法?
  • 您的个人资料中似乎有一行以* 开头。 shell 将* 扩展为您的主目录中的(文件和)目录。可能将 * 替换为 # — 但您需要分析脚本的行来决定什么是最好的。
  • 好吧,这很有趣 - 是的,我的 bash_profile 中最后一行下面实际上有一个单独的 * - 我没有考虑将它包含在我的问题中,因为我不知道它有功能。我刚刚评论了它,现在我的终端打开得很好。注释掉这个* 会有任何有害影响吗?
  • 将其注释掉意味着处理配置文件所需的时间要少得多。删除它可以避免混淆并(不可估量地)节省启动时间。将其保留为评论(成为评论)完全没有害处,并且对您有好处(避免启动时产生噪音)。

标签: macos bash terminal postgis


【解决方案1】:

如何解决 Bash 启动问题

Jonathan Leffler's helpful comment为基础:

  • 从现有终端窗口,运行script log.txt bash -lxv
    • 这将创建一个新的登录 (-l) shell(这是 OSX 默认创建的 Terminal.app 的 shell 类型)并记录其所有启动活动。
    • 除了捕获常规输出,
      • -v 在读取时显示未扩展的源代码行。
      • -x 显示执行的扩展的单个命令,前缀为+
  • 执行exit 以终止该shell,这将保存刚刚打印到log.txt 的所有内容。
  • 研究文件log.txt 看看发生了什么。

原来是 OP 的问题:

  • 他们个人资料中单行的流浪* 扩展为按字母顺序排列的当前目录中文件和文件夹名称的列表(称为路径名扩展或通配的过程)。

    • * 不仅作为它自己的命令(或命令的开头)没有有用,它还可能导致意外执行命令(请参阅下面)。
  • Bash 然后尝试将此扩展的结果作为 command to execute 执行,第一个单词(空格分隔的标记)解释为命令 name

    • 这失败了,因为第一个词发生的不是命令名称。
    • 但是,如果第一个单词恰好是一个有效的命令名称,例如 file该命令将执行
      (除非当前目录恰好在 $PATH 中,否则第一个匹配的文件名是否为可执行文件并不重要 - 重要的是该名称是否与现有命令名称匹配)。
  • 启动时,用户的主目录。是工作目录。相比之下,稍后打开另一个选项卡会使用当时的工作目录,无论它碰巧是什么。

    • 这解释了不同的症状,因为在不同的目录中进行 globbing 通常会导致不同的名称列表,而 Bash 将尝试执行的相应的第一个单词。

【讨论】:

  • 谢谢 - 当然我不知道如何解释大部分输出,但是这两行确实出现在最后:+ Applications Desktop Documents Downloads Library Movies Music Pictures Public log.txt bash: Applications: command not found。你的想法?
  • 这意味着在启动过程中会输出字符串“Applications Desktop Documents Downloads Library Movies Music Pictures Public log.txt”(无论是直接还是作为扩展的结果 - 正如乔纳森建议的那样,可能是通配符),然后将其解释为要执行的命令,从而导致错误;将-v 添加到命令以查看该命令的source 行。
  • 谢谢哥们,这真的很有帮助!
  • @skwidbreth:很高兴听到这个消息;我已经更新了我的答案来解释你的具体症状。
【解决方案2】:

感谢大家的帮助,我能够解决这个问题。当我发布我的问题时,我在我的 bash 个人资料中留下了一个很小但很重要的细节——最后一行有一个单独的星号。

[[ -s "$HOME/.profile" ]] && source "$HOME/.profile" # Load the default .profile

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function

export PATH=${PATH}:/usr/local/mysql/bin  #ADDS MYSQL TO PATH EVERY TIME TERMINAL OPENS
*

以前我什至没有注意到这件事,更不用说明白它在做什么。我将其注释掉,现在一切运行良好。我不确定这个星号是否是 bash 配置文件的标准部分,但如果它一直存在,那么直到今天早上,在我安装 PostGIS 并进行 Github 拉取之后,它才给我带来任何麻烦要求。我不确定为什么这些操作会引发这个问题,但我会尽可能地进行描述,以防其他人遇到这种情况。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2014-12-29
    • 2018-12-10
    • 2015-06-23
    • 2012-01-09
    • 2016-04-11
    • 2017-05-25
    • 2017-01-28
    相关资源
    最近更新 更多