【问题标题】:": Command not found"“: 找不到命令”
【发布时间】:2009-11-03 11:17:35
【问题描述】:

采购一个 env 文件时会出现一些问题(一系列变量导出)

例如:

...
export MY_ROOT=/Soft/dev/blah/blah
export MY_BIN=${MY_ROOT}/bin
...

结果

$. my_env.sh
$echo $MY_BIN
/bint/dev/blah/blah

=> "/bin" 似乎覆盖了变量的开头而不是后缀..

有什么想法吗?

顺便说一句,每次我们source这个文件,都会报错:

": Command not found"

这很奇怪.. 即使我们评论了它的全部内容,这条消息也会出现。

一开始调用的 shell 看起来不错 #!/bin/sh#!/bin/bash

控制字符呢?如何在 linux 上筛选它们?

【问题讨论】:

标签: linux shell export shebang


【解决方案1】:

": Command not found" 是我在 UNIX/Linux shell 脚本被 MS Windows 系统(错误)处理时看到的错误。例如,如果使用 WebCVS 签出,使用记事本或写字板进行修改,然后重新提交。

(它抱怨找不到 [Ctrl-M] 可执行文件 --- 这是一个完全有效的文件名,但对于 UNIX/Linux 来说非常不方便且有些可疑)。

通过 GNU cat -Aod -xhexdump 命令运行文件以查看这些(并验证我的诊断......或通过 tr -d 运行它并使用适当的引用和外壳“逐字”处理您的系统。(例如,典型 Linux 系统上 Bash 下的 tr -d '[Ctrl-V],[Ctrl-M]')。

根据您的 tr 版本,您可能可以使用:tr -d '\r'tr -d \015(015 是 CR 的八进制数,“回车”或 ^M --- MS-DOS 曾经使用过 CR /LF 对作为行终止符,这只是 MS-DOS 在互操作性方面可能在被遗弃的深渊中腐烂的众多原因之一。单个字符的行终止符对其他人没有真正的问题......但 PAIRS 会导致真正的问题当主流计算历史上的其他所有东西都使用单个字符时,转换问题)。

哦,是的,vim 有一个方便的 set ff(又名set fileformat 选项,可以处理 UNIX、MacOS 和 MS-DOS 行终止约定来自vim 的任何副本,无论您在哪个平台上。我似乎记得vim 默认是检测文件正在使用哪种类型的行终止并保持不变(并默认为您平台的本机当然,任何新文件)。

【讨论】:

  • 我也见过这个。这几乎总是一个不正确的换行问题。如果文件受版本控制,请尝试设置换行设置(例如 svn:eol-style 如果在 SVN 下)
  • 对,看起来很奇怪的变量值(实际上是带有嵌入式 CR 的 $'/Soft/dev/blah/blah\r/bin')和错误消息都是脚本文件中有回车符的症状。
【解决方案2】:

这将修复文件中的行尾:

dos2unix my_env.sh

没有必要在一个只会获取源的文件中使用 shebang,因为它无论如何都在当前 shell 中运行。但是,作为评论,它可能对人类读者有用。

【讨论】: