首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >像可执行文件一样运行脚本与通过shell显式运行脚本有什么不同?

像可执行文件一样运行脚本与通过shell显式运行脚本有什么不同?
EN

Unix & Linux用户
提问于 2016-01-11 19:10:47
回答 1查看 512关注 0票数 2
  1. Linux命令、编辑和Shell编程实用指南(命令、编辑和Shell编程实用指南)中,尽管可以使用bash来执行shell脚本,但是这种技术会导致脚本运行得比给自己执行权限和直接调用脚本慢得多。为什么会这样呢?
  2. 像可执行文件一样运行脚本与通过shell显式运行脚本有什么不同?
  3. 这两个步骤都与以下步骤相同:命令行上的命令会导致shell分叉一个新进程,从而创建shell进程(子shell)的副本。新进程尝试执行(执行)命令。与fork一样,exec例程由操作系统(系统调用)执行。因为命令是shell脚本,所以exec失败。当exec失败时,该命令被假定为一个shell脚本,子shell运行脚本中的命令。与期望从命令行输入的登录shell不同,子shell从一个文件(即shell脚本)获取它的输入。
EN

回答 1

Unix & Linux用户

发布于 2016-01-11 19:33:22

假设脚本是一个Bash脚本(即它以#!/bin/bash开头),那么作者在这一点上是错误的。当直接运行shell脚本时,内核在开头看到#!/bin/bash行,然后以脚本的文件名作为参数运行该行,即/bin/bash myscript.sh。换句话说,内核正在执行您将其显式传递给shell时所做的事情。

现在,如果脚本以#!/bin/sh而不是#!/bin/bash开头,那么还有另一种可能性。Bash可以提供/bin/sh,但不必提供。它还优先考虑功能的大小或速度。如果您的/bin/sh是一个更小、更快的shell,那么直接运行脚本将使用该更快的shell,并且脚本将比在Bash下运行得更快。

这种情况发生在基于Debian的发行版(例如Debian、Ubuntu、Mint)中。他们倾向于使用一个名为dash的shell来提供/bin/sh而不是Bash,以使引导脚本运行得更快。

看看你的发行版是怎么做的,ls -l /bin/sh。它可能是指向/bin/bash/bin/dash或另一个shell的符号链接。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/254709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档