我们可以在执行脚本后更改SHELL env变量和解释器

时间:2018-01-02 10:05:44

标签: linux bash shell sh

我有两个问题:

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

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

3 个答案:

答案 0 :(得分:3)

  1. 如果您使用/bin/bash buildllt运行脚本,则#!行将被忽略,并且将使用bash

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

答案 1 :(得分:1)

你的问题的答案:

  1. 如果您明确地运行翻译,则不会考虑shebang。因此/bin/bash buildllt将由/bin/bash运行,无论其是什么。
  2. SHELL环境变量设置为/etc/passwd文件中指示的首选shell(请参阅here)。这应该是用户登录时调用的shell,但不会用于执行任何脚本。 shebang用于此。

答案 2 :(得分:1)

  

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

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

See more about shebang on Wikipedia

  

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

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

BTW,正如 tripleee 指出的那样,export不接受等号周围的空格。你需要写这个来使它工作。

export SHELL=/bin/bash