【问题标题】:shell script behavior across different linux distros跨不同 Linux 发行版的 shell 脚本行为
【发布时间】:2017-03-23 22:25:11
【问题描述】:

我有一个关于跨 2 个不同操作系统的 shell 脚本和进程表的一般性问题。

在 SuSE Linux 系统上,我运行一个名为 joe.sh 的脚本。这是一个执行以下操作的简单脚本


echo "Hello Joe "     
read x

如果我执行ps -ef | grep [j]oe.sh -,它会找到类似这样的结果


joe      15532 24267  0 09:40 pts/2    00:00:00 /bin/sh ./joe.sh

假设我启动了另一个终端并且没有在脚本上按回车键。

但是,如果我在 oracle linux 系统上做同样的事情,我会得到不匹配的结果,直到我在脚本中添加一个 shebang

#!/bin/bash
echo "Hello Joe"
read x

SuSE 的环境中是否有一些可以设置的默认值?我想在 Oracle Linux 系统上复制这种行为。

【问题讨论】:

  • 你没有匹配是什么意思?脚本是否立即运行并终止?它甚至没有正确执行吗?出于某种原因,您正在使用sh 执行它(可以在ps 输出行中看到)。无论如何,您通常都希望始终放入 hashbang (#!)。
  • ps -ef | grep [j]oe.sh 不返回任何结果(在 oracle 上)。该脚本挂在进程表中,直到我输入一些内容。我是这样设置的,这样我就可以打开另一个 xterm 窗口并以不同的方式搜索进程。我知道总是包含 shebang 是一种很好的做法,我只是好奇是否有人知道为什么 suse 总是默认有 /bin/sh 而 oracle 不会
  • oracle 上的默认 shell 是什么,它是否支持字符类(例如 [stuff]?)。巴什会。如果 oracle 上的默认 shell 没有,那么您就有答案了。
  • 我在两个系统上都发出了命令 echo $SHELL,它们都返回 /bin/bash

标签: linux bash shebang


【解决方案1】:

脚本应该总是有一个 shebang 行,除非它们打算是 sourced。 default shell in SuSE 是 Bash。在顶部添加#!/bin/bash

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是:interpreter-script

    无论如何,脚本应该总是有一个 shebang 行。 (我第二个约翰)

    【讨论】:

      【解决方案3】:

      正如您在状态行中看到的,被调用的默认 shell 是 sh

      乔 15532 24267 0 09:40 pts/2 00:00:00 /bin/sh ./joe.sh

      所以它使用sh 执行。

      如前所述,默认情况下,SuSE 中的 shell 应该是 Bash。但是,可以为每个用户进行不同的配置。任何用户(通常在基于 UNIX 的系统中)的默认 shell 都在 /etc/passwd 文件中定义。

      该文件的每一行都是一个用户,字段由: 符号分隔。第 7 个字段是默认的用户 shell(用户登录时执行的 shell)。

      更详细的解释可以在:http://www.cyberciti.biz/faq/understanding-etcpasswd-file-format/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 2014-03-26
        • 1970-01-01
        • 2020-08-16
        • 2015-09-24
        相关资源
        最近更新 更多