首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >相同的shell脚本在不同的Linux发行版上有不同的行为。

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

Stack Overflow用户
提问于 2013-08-07 02:12:30
回答 1查看 315关注 0票数 1

我只需编写一个shell脚本,就可以轻松编译代码。我的目录树看起来像:

代码语言:javascript
运行
复制
TOPDIR
|
+--- DIR[1]
.
.
.
+--- DIR[n]
|
+--- DIR[n+1]
      |
      +--- makefile

我以前使用以下命令编译代码:

代码语言:javascript
运行
复制
$cd DIR[n+1]
$make

因为我想在编译代码后返回到TOPDIR,因此,我键入:

代码语言:javascript
运行
复制
$cd -

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

代码语言:javascript
运行
复制
#! /bin/sh
cd $HOME/$WORKDIR/$MAKEDIR
make
cd -

它工作得很好,在这之后,我从我们的供应商那里得到了新的代码,它在make过程中改变了一些东西。目录树看起来与前面的几乎相同,但它使用shell脚本启动make进程:

代码语言:javascript
运行
复制
TOPDIR
|
+--- DIR[1]
|
+--- DIR[2]
.
.
.
+--- DIR[N]
      |
      +--- DIR[n]
      |     |
      |     +---build_1.sh
      +---build_2.sh

在build_1.sh中,它只包含:

代码语言:javascript
运行
复制
#! /bin/sh
source ../build_2.sh

因此,我首先使用:

代码语言:javascript
运行
复制
$cd DIR[n]
$./build_1.sh

编译后,我使用:

代码语言:javascript
运行
复制
$cd -

但是我用脚本写我的命令:

代码语言:javascript
运行
复制
#! /bin/sh
cd DIR[n]
./build_1.sh
cd -

它向我展示:

代码语言:javascript
运行
复制
./build_1.sh: 2: ./build_1.sh: source: not found

我在openSUSE上使用了相同的脚本;它没有问题。但是在ubuntu-13.04上,它的弹出超出了错误。我在source中测试了ubuntu-13.04函数,没有问题。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-07 04:15:14

在Ubuntu中,默认的shell /bin/sh是指向/bin/dash的象征性链接-- bashdash有足够的共同功能,以至于大多数人从未意识到两者的区别,但它们并不相同(破折号意味着要更轻)。

Debian shell (dash)是一个Unix shell,比Bash小得多,但它仍然以POSIX兼容为目标。它需要更少的磁盘空间,但功能也不那么丰富。-维基百科

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

因此,我的建议是:永远不要假设bash是默认的shell,如果可以或显式地指向/bin/bash,请坚持POSIX标准的语法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18093506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档