【问题标题】:Can we change SHELL env variable and interpreter after executing script我们可以在执行脚本后更改 SHELL env 变量和解释器吗
【发布时间】:2018-01-02 10:05:43
【问题描述】:

我有两个问题:

  1. 我有一个使用#!/bin/sh 的脚本buildllt。所以,如果我使用:/bin/bash buildllt 运行脚本。操作系统将使用什么 shell 解释器? shbash

  2. 如果使用默认shellsh运行脚本后,我们可以导出SHELL吗 环境变量为export SHELL = /bin/bash?是否会使用不同的 shell 解释下一个语句?

【问题讨论】:

  • 相关,请使用#!/usr/bin/env sh#!/usr/bin/env bash#!/usr/bin/env python#!/usr/bin/env python2

标签: linux bash shell sh


【解决方案1】:
  1. 如果您使用/bin/bash buildllt 运行脚本,则#! 行将被忽略,而bash 将被使用。

  2. 没有。 SHELL 被一个 shell 设置为登录 shell 的名称,它不被读取。即使被读取,导出也不会影响父进程。如果您想运行交互式 bash 会话,只需键入 bash 甚至 exec bash 即可替换您之前的 sh 程序。

【讨论】:

    【解决方案2】:

    你的问题的答案:

    1. 如果显式运行解释器,则不会考虑 shebang。所以/bin/bash buildllt 将由/bin/bash 运行,不管shebang。
    2. SHELL 环境变量设置为/etc/passwd 文件中指定的首选shell(请参阅here)。这应该是用户登录时调用的 shell,但不会用于执行任何脚本。 shebang 就是用来做这个的。

    【讨论】:

      【解决方案3】:

      我有一个使用#!/bin/sh 的脚本buildllt。所以,如果我使用/bin/bash buildllt 运行脚本。操作系统将使用什么 shell 解释器? shbash

      当然是/bin/bash。 shebang 是为了让操作系统确定当直接执行脚本文件时,即当你运行./buildllt 时使用哪个解释器。操作系统将读取第一行并为脚本选择一个解释器。如果您调用bash buildllt,那么操作系统只需执行bash 并将脚本作为参数提供,然后bash 将忽略shebang 行(因为它以被视为注释的哈希开头)。

      See more about shebang on Wikipedia

      如果使用默认shell sh运行脚本后,我们可以将SHELL环境变量导出为export SHELL = /bin/bash

      是的,但不会有任何影响。 SHELL 环境变量用于确定使用哪个shell 作为用户的登录shell。它在/etc/passwd 中指定,仅对shell 登录有效(如su user 或从终端登录时,在使用GNOME 等桌面环境登录时无效)。即使您更改它,以后的脚本也不会受到影响。它们仍然使用 shebang 行指定的解释器运行。您肯定不希望 Python 脚本 #!/usr/bin/python3bash 运行,对吧?

      顺便说一句,正如 tripleee 指出的那样,export 不接受等号周围的空格。您需要编写此代码才能使其正常工作。

      export SHELL=/bin/bash
      

      【讨论】:

      • 也许还会指出export 中的语法错误——它不适用于等号周围的空格。
      • @tripleee 好地方。
      猜你喜欢
      • 2018-01-24
      • 2010-10-02
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2015-06-27
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多