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

问题描述 投票:2回答:3

我有两个问题:

  1. 我有一个使用buildllt的脚本#!/bin/sh。所以,如果我使用:/bin/bash buildllt运行脚本。操作系统将使用哪种shell解释器? shbash
  2. 如果在使用默认shell sh运行脚本后,我们可以将SHELL env变量导出为export SHELL = /bin/bash吗?下一个语句是否会使用不同的shell进行解释?
linux bash shell sh
3个回答
3
投票
  1. 如果使用/bin/bash buildllt运行脚本,则将忽略#!行,并使用bash
  2. 没有.SHELL是由shell设置的,作为登录shell的名称,它不被读取。即使它被读取,导出它也不会影响父进程。如果你想运行一个交互式bash会话,那么只需输入bash甚至exec bash来替换你以前的sh程序。

1
投票

你的问题的答案:

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

1
投票

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

当然/bin/bash。 shebang用于操作系统确定在直接执行脚本文件时使用哪个解释器,即运行./buildllt时。操作系统将读取第一行并为脚本选择解释器。如果你调用bash buildllt然后OS只是执行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,对吧?

顺便说一句,正如三人指出的那样,export不接受等号周围的空格。你需要写这个来使它工作。

export SHELL=/bin/bash
© www.soinside.com 2019 - 2024. All rights reserved.