1

我只是简单地编写了一个 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 -

它运行良好,在此之后,我从我们的供应商那里得到了新代码,它改变了制作过程中的一些东西。目录树看起来和以前几乎一样,但它使用一个 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,使用没有问题。

对此问题有何评论?

4

1 回答 1

1

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

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

坚持使用POSIX语法应该是安全的,但如果bash您的脚本使用的功能仅在./bin/sh/bin/bash/bin/shbash

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

于 2013-08-07T04:15:14.053 回答