gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:44 25 4
gpt4 key购买 nike

我只是写了一个 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上,会弹出上面的错误。我在ubuntu-13.04中测试了source功能,没有问题。

对这个问题有什么意见吗?

最佳答案

在 Ubuntu 中,默认 shell /bin/sh是指向 /bin/dash 的符号链接(symbolic link)- bashdash有足够多的共同功能,大多数人永远不会意识到其中的区别,但它们并不相同(破折号是为了更轻)。

The Debian Almquist shell (dash) is a Unix shell, much smaller than Bash, but it is still aiming at POSIX-compliance. It requires less disk space, but it is also less feature-rich. - Wikipedia

坚持使用 POSIX 语法应该是安全的,但是如果您的脚本使用的功能仅在 bash 中可用, 请务必更改 /bin/sh 中的 shebang至 /bin/bash避免系统出现问题 /bin/sh不是 bash .

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

关于linux - 相同的 shell 脚本在不同的 Linux 发行版上有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com