我只是编写了一个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脚本来启动make进程:
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
上,它弹出错误。我测试了source
中的ubuntu-13.04
函数,没有问题可以使用。
对此问题有何评论?
答案 0 :(得分:1)
在Ubuntu中,默认shell /bin/sh
是指向/bin/dash
的符号链接 - bash
和dash
具有足够的共同功能,大多数人从未意识到差异,但它们不相同(破折号意味着更轻)。
Debian Almquist shell(破折号)是一个Unix shell,比Bash小得多,但它仍然瞄准POSIX兼容性。它需要的磁盘空间更少,但功能也更少。 - 维基百科
在坚持使用POSIX语法时应该是安全的,但如果您的脚本使用仅在bash
中可用的功能,请务必将shebang从/bin/sh
更改为/bin/bash
避免/bin/sh
不是bash
的系统出现问题。
所以我的建议是:永远不要假设bash是默认的shell,如果你能够或明确指向shebang的/bin/bash
,那么坚持使用POSIX标准的语法。