相同的shell脚本在不同的Linux发行版上有不同的行为
我只是编写了一个shell脚本,使我能够轻松地编译代码。我的目录树如下所示:相同的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
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根本没有更改目录。