我有两个问题:
buildllt
的脚本#!/bin/sh
。所以,如果我使用:/bin/bash buildllt
运行脚本。操作系统将使用哪种shell解释器? sh
或bash
sh
运行脚本后,我们可以将SHELL
env变量导出为export SHELL = /bin/bash
吗?下一个语句是否会使用不同的shell进行解释?/bin/bash buildllt
运行脚本,则将忽略#!
行,并使用bash
。SHELL
是由shell设置的,作为登录shell的名称,它不被读取。即使它被读取,导出它也不会影响父进程。如果你想运行一个交互式bash会话,那么只需输入bash
甚至exec bash
来替换你以前的sh
程序。你的问题的答案:
/bin/bash buildllt
将由/bin/bash
管理,无论shebang。SHELL
环境变量设置为/etc/passwd
文件中指示的首选shell(请参阅here)。这应该是用户登录时调用的shell,但不会用于执行任何脚本。 shebang用于此。我有一个使用
buildllt
的脚本#!/bin/sh
。所以,如果我使用/bin/bash buildllt
运行脚本。操作系统将使用哪种shell解释器?sh
或bash
当然/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