【问题标题】:source command not found in sh shell在 sh shell 中找不到源命令
【发布时间】:2012-11-22 01:12:55
【问题描述】:

我有一个使用sh shell 的脚本。我在使用source 命令的行中遇到错误。似乎source 不包含在我的sh shell 中。

如果我明确尝试从 shell 运行 source,我会得到:

sh: 1: source: not found

我应该以某种方式安装“源”吗?我的sh 版本有误吗?

【问题讨论】:

  • 有人可以合理地辩称,支持source 的shell 是“错误版本”。
  • 另外,错误消息source: not found 表示source 命令已正确评估,但它应该读取的文件不存在。
  • 无法“安装”source因为它是 shell 的一个特性。它不能作为外部命令实现。

标签: bash shell sh


【解决方案1】:

/bin/sh 通常是其他一些试图模仿 The Shell 的 shell。许多发行版使用/bin/bash 表示sh,它支持source。但是,在 Ubuntu 上,使用了不支持 source/bin/dash。大多数 shell 使用 . 而不是 source。如果您无法编辑脚本,请尝试更改运行它的 shell。

【讨论】:

  • 谢谢!用 /bin/bash 替换 /bin/sh 在 Ubuntu 上确实有效!我很好奇为什么,这是否意味着在 Ubuntu 上 bash 是 sh?
  • @Milad:在最近的 Ubuntu 上,/bin/sh 调用 /bin/dash。传统上,/bin/sh 称为 /bin/bash 是 sh 兼容模式。
  • @Milad 我认为它不适用于 ubuntu 14.04。您的操作系统版本是多少?
  • 也许知道帮助 - 如果您有级联脚本,则重命名所有“sh -> bash”。谢谢你。 :-)
  • 不幸的是,如何解决这个问题对我来说并不是很直观,但它让我走上了正确的道路。我必须将SHELL := /bin/bash 添加到我的 Makefile 的顶部。
【解决方案2】:

在 Bourne shell(sh) 中,使用 .获取文件的命令

. filename

在某些操作系统/环境中(至少是 Mac OS、Travis-CI、Ubuntu),这必须是:

. ./filename

(归功于Adrien Joly's comment below

【讨论】:

  • 我真的不能更改脚本,它在 redhat 服务器上运行良好。但是在该服务器上,源似乎包含在 sh
  • 如果有source,严格来说不是sh
  • 我在 Jenkins 上遇到了这种类型的问题(试图获取存储为“秘密文件”的文件)并通过“.”进行采购。命令是解决方案。
  • 为了兼容 Mac OS(开发环境)和 Travis-CI(测试环境),我不得不使用. ./filename。否则,在 Travis-CI 上运行测试时,我会收到 sh: 1: .: filename: not found 错误。
  • 感谢您在 ubuntu 20.04 上的工作。虽然我不得不在 npm 命令中运行 shell 脚本
【解决方案3】:
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

这样就OK了

【讨论】:

  • 不错!我正在运行 RHEL 和 Ubuntu 服务器,但我总是遇到一些小问题,比如 Ubuntu 的这个问题。我真的很喜欢 RHEL 和喜欢 linux 的 RHEL。
  • 接受的答案在 Ubuntu 14 上不起作用,这个可以!
  • 请为您的答案添加一些进一步的解释 - 它有什么作用? dpkg-reconfigure 可能并非所有用户都可以访问,尤其是在不基于 Debian 的系统上
  • 在 debian 升级后修复了我的 source: not found 旧 telnet 客户端错误,谢谢。
【解决方案4】:

source 内置是一个 bashism。将其简单地写为.

例如

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

【讨论】:

    【解决方案5】:

    出现这个问题是因为 jenkins Execute Shell 通过它的 /bin/sh 运行脚本

    因此,/bin/sh 不知道“来源”

    您只需在 jenkins 中的 Execute Shell 顶部添加以下行

    #!/bin/bash
    

    【讨论】:

    • 给定的问题毕竟与 Jenkins 无关
    【解决方案6】:

    我在尝试从 #Jenkins 执行 shell 调用 source 命令时遇到此错误。

    source profile.txt 要么 source profile.properties

    source命令的替换是使用,

    . ./profile.txt 要么 . ./profile.properties

    注意:两个点之间有一个空格(.)

    【讨论】:

      【解决方案7】:

      source 命令内置在某些 shell 中。如果你有一个脚本,它应该在第一行指定使用什么shell,例如:

      #!/bin/bash
      

      【讨论】:

      • 好吧,如果我手动输入 sh 并询问它告诉我的“哪个来源”,它会显示 #!/bin/sh 和另一个 linux:来源:shell 内置命令
      • 哦,这就是这条线的用途。我一直想知道。非常感谢!
      【解决方案8】:

      我在 Ubuntu 上的一个 gnu Makefile 中找到,(其中 /bin/sh -> bash)

      我需要使用 .命令,以及使用 ./ 前缀指定目标脚本(参见下面的示例)

      source 在这种情况下不起作用,不知道为什么,因为它应该调用 /bin/bash..

      我的 SHELL 环境变量也设置为 /bin/bash

      test:
          $(shell . ./my_script)
      

      请注意,此示例不包含制表符;必须为堆栈交换格式化。

      【讨论】:

        【解决方案9】:

        source是bash内置命令,所以要执行source命令,可以root登录。

        sudo -s source ./filename.sh

        【讨论】:

        • 这看起来不是一个有效的解决方案。如果用户没有 sudo 权限怎么办?并且来源的东西之后只能作为管理员用户使用,这会造成新的麻烦
        【解决方案10】:

        在 Ubuntu 上,我没有使用 sh scriptname.sh 来运行文件,而是使用 . scriptname.sh 并且成功了! 我的文件的第一行包含: #!/bin/bash

        使用此命令运行脚本

        .name_of_script.sh
        

        【讨论】:

        • 这已被多次回答。如果您在这种情况下添加新答案,请提供更多信息
        【解决方案11】:

        这可能会对你有所帮助,我收到此错误是因为我试图使用命令 . .profile 重新加载我的 .profile 并且它有语法错误

        【讨论】:

          【解决方案12】:

          Bourne shell (sh) 使用 PATH 定位到 source <file>。如果您尝试获取的文件不在您的路径中,则会收到错误“找不到文件”。

          试试:

          source ./<filename>
          

          【讨论】:

          • 帖子说sh: 1: source: not found不是file not found
          猜你喜欢
          • 2021-07-07
          • 2019-08-10
          • 2021-11-13
          • 2019-04-19
          • 2013-05-16
          • 2018-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多