我的脚本使用shebang line开发为"#!/ bin / ksh"而默认的shell是
$ echo $SHELL
/bin/ksh
我正在移动所有这些脚本而不将shebang行更改为默认shell所在的新机器
$ echo $SHELL
/bin/bash
我应该担心吗?
我猜不应该有任何问题,因为shebang行将覆盖解释器并使用脚本中定义的ksh并且正如我想要的那样。
请分享您的想法..
答案 0 :(得分:1)
默认shell不会影响脚本的执行方式(除非您使用的shell执行非常奇怪的操作)。
没有实际上这似乎不正确,但无论如何你没有担心这一点。#!
行的可执行脚本将使用/bin/sh
执行。
只要您的脚本以#!/bin/ksh
和开头,您就可以正常执行它们,系统会将它们传递给/bin/ksh
来执行它们。
可能可能需要担心的一件事是/bin/ksh
是否存在,如果存在,那就是它是什么。在我的系统(Linux Mint 17)上,/bin/ksh
是/etc/alternatives/ksh
的符号链接,后者又是/bin/ksh93
的符号链接。
带有#!/bin/ksh
的脚本可能很常见,几乎所有类UNIX系统都会满足它们,并且会在该位置安装某些行为类似于ksh的内容。
请注意,$SHELL
指定的“默认shell”不是系统范围的默认值。它只是特定环境变量的值。根据{{1}}中指定的shell或等效的值,在登录时为每个用户设置该变量;因此不同的用户可以拥有不同的默认shell。您可以在登录后更改/etc/passwd
的值。$SHELL
中的条目或等效项在创建帐户时设置,稍后可以更改。如果没有指定shell,大多数系统都有一个为新帐户设置的默认用户shell(例如,大多数Linux系统用户/etc/passwd
)。
答案 1 :(得分:0)
给出的假设是正确的:在任何execve()
电话中都会尊重shebang线。只有当您的脚本来源(. yourscript
或source yourscript
)或缺少有效的shebang时,您才需要关心他们从哪个口译员打电话。
如果不是这样,非shell语言中的脚本将无法按预期工作(例如,Python解释器永远不会系统的默认shell)
答案 2 :(得分:0)
内核将使用shebang行选择在默认方式执行脚本时使用的相应解释器,无论是sh
,bash
,ksh
,{{ 1}},expect
或其他什么。要警惕的唯一真正的问题是在系统上编写的脚本,其中python
是一个特定的shell(例如bash),然后移动到另一个系统sh
是一个不同的shell(例如破折号),因为他们可能会使用前者中没有的shell特征。