2012-12-04 208 views
61

我有一个使用sh shell的linux脚本。我在使用“source”命令的行中出现错误。基本上,它似乎“源”不包括在我的SH壳。如果我输入sh并输入源码,我会得到:在sh shell中找不到source命令

sh: 1: source: not found 

我应该明确安装“source”吗?我有sh shell的错误版本吗?

+1

人们完全有理由认为,它支持一个壳'source'是“错版”。 –

+1

此外,错误消息“source:not found”意味着'source'命令被正确评估,但它应该读取的文件不存在。 –

回答

50

/bin/sh通常是一些其他的shell试图仿效shell。许多发行版使用/bin/bash代替sh,它支持source。但在Ubuntu上,使用/bin/dash,它不支持source。如果您不能编辑脚本,请尝试更改运行它的外壳。

+2

谢谢!用/ bin/bash替换/ bin/sh在Ubuntu上可以工作!我很好奇,为什么呢,这是否意味着Ubuntu的bash是sh? – Milad

+1

@Milad:在最近的Ubuntus上,'/ bin/sh'调用'/ bin/dash'。传统上,称为'/ bin/bash'的'/ bin/sh'是sh兼容模式。 – choroba

+0

@Milad我认为它不适用于Ubuntu 14.04。什么是您的操作系统版本? –

58

在Bourne shell(sh)中,使用。命令来源文件

. filename 
+0

我真的不允许更改脚本,它在红帽服务器上运行良好。但在该服务器上,源似乎包含在sh – Milad

+2

中如果它具有'source',则它不是'sh'。 – tripleee

+2

我在Jenkins上有这种类型的问题(试图以“秘密文件”的形式存储文件)并以“。”开头。命令是解决方案。 –

6

source命令内置到一些shell。如果你有一个脚本,它应规定在第一行用什么壳,如:

#!/bin/bash 
+0

好吧,它说#!/ bin/sh,在另一个linux上,如果我手动输入sh并询问它告诉我的“源”:source:sh​​ell内置命令 – Milad

+0

哦,这就是这行代码。我一直在想。非常感谢! – commonSenseCode

28
$ls -l `which sh` 
/bin/sh -> dash 

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

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

那么这将是确定

+0

不错!我运行的是RHEL和Ubuntu服务器,而且我总是遇到像Ubuntu这样的小问题。我非常喜欢Linux和RHEL。 – radtek

+0

被接受的答案在Ubuntu 14上不起作用,这是做的! – rohithpr

0

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

尝试:

source ./<filename> 
+2

这篇文章说'sh:1:source:not found' not'file not found' –

0

我在Ubuntu上一个GNU Makefile中发现,(这里的/ bin/sh的 - > bash)的

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

源没有在这种情况下,不知道为什么,因为它应该调用/斌/ bash的工作..

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

test: 
    $(shell . ./my_script) 

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

3

此问题是因为詹金斯执行壳牌通过其/ bin/sh的运行脚本

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

你只需要在添加下面的一行您的顶部詹金斯执行shell

#!/bin/bash 
-1

这可能会帮助你,我得到这个错误,因为我试图重新加载我.profile与命令. .profile,它有一个语法错误

0

是内置命令,以便执行源命令bash中,你可以以root身份登录。

sudo -s source ./filename.sh