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