Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相同的shell脚本在不同的Linux发行版上有不同的行为_Linux_Shell_Ubuntu_Opensuse - Fatal编程技术网

相同的shell脚本在不同的Linux发行版上有不同的行为

相同的shell脚本在不同的Linux发行版上有不同的行为,linux,shell,ubuntu,opensuse,Linux,Shell,Ubuntu,Opensuse,我只是编写了一个shell脚本,使我能够轻松地编译代码。我的目录树如下所示: TOPDIR | +--- DIR[1] . . . +--- DIR[n] | +--- DIR[n+1] | +--- makefile 我曾经使用以下命令编译我的代码: $cd DIR[n+1] $make 因为我想在编译代码后返回TOPDIR,因此,我键入: $cd - 我想把它放在一个shell脚本文件中,所以我写: #! /bin/sh cd $HOME/$WORKDIR/$M

我只是编写了一个shell脚本,使我能够轻松地编译代码。我的目录树如下所示:

TOPDIR
|
+--- DIR[1]
.
.
.
+--- DIR[n]
|
+--- DIR[n+1]
      |
      +--- makefile
我曾经使用以下命令编译我的代码:

$cd DIR[n+1]
$make
因为我想在编译代码后返回TOPDIR,因此,我键入:

$cd -
我想把它放在一个shell脚本文件中,所以我写:

#! /bin/sh
cd $HOME/$WORKDIR/$MAKEDIR
make
cd -
它工作得很好,在这之后,我从我们的供应商那里得到了新代码,它在make过程中改变了一些东西。目录树看起来与上一个目录树几乎相同,但它使用shell脚本启动生成过程:

TOPDIR
|
+--- DIR[1]
|
+--- DIR[2]
.
.
.
+--- DIR[N]
      |
      +--- DIR[n]
      |     |
      |     +---build_1.sh
      +---build_2.sh
在build_1.sh中,它只包含:

#! /bin/sh
source ../build_2.sh
因此,我首先使用:

$cd DIR[n]
$./build_1.sh
编译后,我使用:

$cd -
但我用脚本编写命令:

#! /bin/sh
cd DIR[n]
./build_1.sh
cd -
它告诉我:

./build_1.sh: 2: ./build_1.sh: source: not found
我在
openSUSE
上使用相同的脚本;没问题。但是在
ubuntu-13.04
上,上面弹出了错误。我在
ubuntu-13.04
中测试了
source
函数,使用起来没有问题


对这个问题有何评论?

在Ubuntu中,默认的shell
/bin/sh
是指向
/bin/dash
-
bash
的符号链接,而
dash
有足够的共同功能,大多数人从未意识到它们之间的区别,但它们并不相同(dash意味着更轻)

Debian Almquist shell(dash)是一个Unix shell,比Bash小得多,但它仍然致力于POSIX兼容性。它需要较少的磁盘空间,但功能也较少。-维基百科

坚持POSIX语法应该是安全的,但如果脚本使用的功能仅在
bash
中可用,请确保将shebang从
/bin/sh
更改为
/bin/bash
,以避免在
/bin/sh
不是
bash
的系统中出现问题


所以我的建议是:永远不要假设bash是默认的shell,如果可以的话,坚持使用POSIX标准的语法,或者明确地指向shebang的
/bin/bash

,默认的shell
/bin/sh
是指向
/bin/dash
-
bash
dash
的符号链接,它们有足够的共同功能,大多数人从未意识到它们的不同,但它们并不相同(dash意味着更轻)

Debian Almquist shell(dash)是一个Unix shell,比Bash小得多,但它仍然致力于POSIX兼容性。它需要较少的磁盘空间,但功能也较少。-维基百科

坚持POSIX语法应该是安全的,但如果脚本使用的功能仅在
bash
中可用,请确保将shebang从
/bin/sh
更改为
/bin/bash
,以避免在
/bin/sh
不是
bash
的系统中出现问题


所以我的建议是:永远不要假设bash是默认的shell,如果可以的话,坚持使用POSIX标准的语法,或者在shebang处显式地指向
/bin/bash

这里广泛猜测:在ubuntu中,/bin/sh链接到/bin/dash。将shebang改为/bin/bash,看看问题是否消失。@Paulo Scardine,非常感谢!!它是有效的,我可以知道
bash
dash
之间的区别吗?我已经给出了完整的答案,希望将来能帮助其他人。我建议在脚本中使用
cd-
是次优的。您应该使用一个子shell来避免执行
cd-
。如果执行
(cd dir[N+1];make)
,则子shell在子目录中运行,但父shell根本没有更改目录。这里的猜测是:在ubuntu中,/bin/sh链接到/bin/dash。将shebang改为/bin/bash,看看问题是否消失。@Paulo Scardine,非常感谢!!它是有效的,我可以知道
bash
dash
之间的区别吗?我已经给出了完整的答案,希望将来能帮助其他人。我建议在脚本中使用
cd-
是次优的。您应该使用一个子shell来避免执行
cd-
。如果执行
(cd dir[N+1];make)
,则子shell在子目录中运行,但父shell根本没有更改目录。