精华内容
下载资源
问答
  • Hex转bin以及合并和相互转换

    热门讨论 2015-07-27 10:14:54
    里面包含了Hex文件的合并移机Hex文件转Bin文件,本来打算Bin转Hex也块做的,基于下面两个原因,没有做: 1、bin转hex功能暂时我没用到,而且也应该不会用到 2、bin转hex牵涉到一个起始地址问题,bin文件全是数据,不...
  • 支持win7 64位的hex2bin程序

    千次下载 热门讨论 2015-06-14 10:12:43
    支持win7 64位的hex2bin程序。支持intel或motorola hex文件到bin文件的转换。 下载地址:sourceforge.net Hex2bin Intel Hex or Motorola Hex file converter Converts Motorola and Intel hex files to binary. ...
  • CentOS-6.7-x86_64-bin-DVD1.iso CentOS-6.7-x86_64-bin-DVD2.iso CentOS-6.9-x86_64-bin-DVD1.iso CentOS-6.9-x86_64-bin-DVD2.iso 下载地址,提供了官网和百度云的下载连接。如果官网打不开,那就用我百度云的吧。
  • 一直在使用的银行BIN码,很全很全,绝对好用。已整合成JSON数据,格式如下: { "bin": "621098", "bankName": "邮储银行-绿卡通-借记卡" }, { "bin": "622150", "bankName": "邮储银行-绿卡银联标准卡-借记卡...
  • BIN文件查看器

    热门讨论 2014-09-10 21:44:56
    BIN文件查看器 可以查看BIN文件,将其换转为TXT文档
  • C# 读取 bin 文件

    热门讨论 2014-06-26 15:35:05
    版本:VS2010 C#读取bin文件,并显示在TextBox控件内
  • gradle-3.3-bin.zip

    千次下载 热门讨论 2017-01-07 17:02:22
    官网下载不成功的,可以直接在这里下载。 官网原下载地址:https://services.gradle.org/distributions/
  • vc读取bin文件

    热门讨论 2014-08-04 18:19:09
    读取bin文件 mfc工程文件 可直接运行
  • mysql-connector-java-5.1.42-bin.jar 官网下载的驱动
  • S19转BIN文件工具

    热门讨论 2013-09-09 09:29:55
    从flash中读取的是S19格式的文件转换为bin 的工具。
  • 路由器备份config.bin文件密码查看器

    热门讨论 2014-10-09 20:24:59
    从路由器备份config.bin文件里查看并找回宽带密码
  • mysql-connector-java-5.1.40-bin.jar

    千次下载 热门讨论 2016-10-29 09:35:16
    jdbc的驱动jar包,有需要的童鞋自取。
  • BIN文件修改器

    热门讨论 2012-12-07 01:02:00
    BIN文件修改器 一款修改墨香BIN文件的软件·
  • bin转img工具

    热门讨论 2012-10-22 01:37:35
    本工具是支持bin文件转向img文件的,方便实用,欢迎大家下载使用!
  • 一、bin链的介绍 bin是一个由struct chunk结构体组成的链表 前面介绍过,不同的chunk根据特点不同分为不同的chunk,为了将这些chunk进行分类的管理,glibc采用了bin链这种方式管理不同的chunk 不同的bin链是由...

    一、bin链的介绍

    • bin是一个由struct chunk结构体组成的链表。
    • 前面介绍过,不同的chunk根据特点不同分为不同的chunk,为了将这些chunk进行分类的管理,glibc采用了bin链这种方式管理不同的chunk。
    • 不同的bin链是由arena管理的。
    • bin链中的chunk均为free chunk。

    二、bin链分类

    • 根据bin链成员的大小不同,分为以下几类:
      • fast bin是单链表,其他都是双向链表。
      • Fast bin。
      • Unsorted bin。
      • Small bin。
      • Large bin。

    三、bin链的保存(struct malloc_state结构体)

    typedef struct malloc_chunk* mchunkptr;
    typedef struct malloc_chunk *mfastbinptr;
    
    
    struct malloc_state
    { 
      ...
      /*other member*/
      ...
    
      /* Fastbins */
      mfastbinptr fastbinsY[NFASTBINS];
    
      /* Normal bins packed as described above */
      mchunkptr bins[NBINS * 2 - 2];
    
      ...
      /*other member*/
      ...
    }; 
    • 前面说过,不同的bin链是由arena管理的。因此一个线程中会有很多的bin链,这些bin链都有arena所表示的struct malloc_state结构体的以下成员保存:
      • fastbinY数组:大小为10。记录的是fast bin链。
      • bins数组:大小为129。记录的是unsorted bin(1)、small bin(2~63)、large bin链(64~126)。

    四、Fast Bin

    • 概念:chunk的大小在32字节~128字节(0x20~0x80)的chunk称为“fast chunk”(大小不是malloc时的大小,而是在内存中struct malloc_chunk的大小,包含前2个成员)。
    • fast bin链表的个数为10个。
    • 不会对free chunk进行合并:鉴于设计fast bin的初衷就是进行快速的小内存分配和释放,因此系统将属于fast bin的chunk的PREV_INUSE位总是设置为1,这样即使当fast bin中有某个chunk同一个free chunk相邻的时候,系统也不会进行自动合并操作,而是保留两者。虽然这样做可能会造成额外的碎片化问题,但瑕不掩瑜。

    fastbinsY数组存储fastbins的规则

    • 每个fast bin链表都是单链表(使用fd指针)。因此,fast bin中无论是添加还是移除fast chunk,都是对“链表尾”进行操作,而不会对某个中间的fast chunk进行操作。
    • 单个fastbin链表中的chunk大小都是相同的,各个fastbin链表中的chunk大小是不同的。
    • fastbinY数组中的每个bin链表的排序,是按照链表元素的大小进行排序的。数组的第一个元素的fast bin链表中的每个chunk的大小是32字节的,数组的第二个元素的fast bin链表中的每个chunk的大小是48字节的......每个元素都比前面的fast bin链大16字节,以此类推进行排序。

    链表索引宏定义:(fastbin_index)

    • 功能:通过此宏能判断某一个fastchunk属于哪一个fastbin链表。
    • 参数:某一个chunk的大小。

    malloc操作与fastbins的初始化:

    • 当应用层通过malloc函数第一次申请的chunk属于16字节~80字节之间时,因为初始化的时候fast bin支持的最大内存大小以及所有fast bin链表都是空的,所以它也不会交由fast bin来处理,而是向下传递交由small bin来处理,如果small bin也为空的话就交给unsorted bin处理。
    • 那么,fast bin如何进行初始化哪?
      • 当我们第一次调用malloc(fast bin)的时候,系统执行_int_malloc函数,该函数首先会发现当前fast bin为空,就转交给small bin处理,进而又发现small bin 也为空,就调用malloc_consolidate函数对malloc_state结构体进行初始化。malloc_consolidate函数主要完成以下几个功能:
        • a.首先判断当前malloc_state结构体中的fast bin是否为空,如果为空就说明整个malloc_state都没有完成初始化,需要对malloc_state进行初始化。
        • b.malloc_state的初始化操作由函数malloc_init_state(av)完成,该函数先初始化除fast bin之外的所有的bins,再初始化fast bins。
      • 那么当再次执行malloc(fast chunk)函数的时候,此时fast bin相关数据不为空了,就可以使用fast bin。

    free操作

    • 这个操作很简单,主要分为两步:先通过chunksize函数根据传入的地址指针获取该指针对应的chunk的大小;然后根据这个chunk大小获取该chunk所属的fast bin,然后再将此chunk添加到该fast bin的链尾即可。整个操作都是在_int_free函数中完成。

    五、Unsorted Bin

    • 何时使用:当释放较小或较大的chunk的时候,如果系统没有将它们添加到对应的bins中,系统就将这些chunk添加到unsorted bin中。
    • 目的:这主要是为了让“glibc malloc机制”能够有第二次机会重新利用最近释放的chunk(第一次机会就是fast bin机制)。利用unsorted bin,可以加快内存的分配和释放操作,因为整个操作都不再需要花费额外的时间去查找合适的bin了。
    • Unsorted bin的特性如下:
      • unsorted bin的个数: 1个。
      • unsorted bin是一个由free chunks组成的循环双链表。
      • 在unsorted bin中,对chunk的大小并没有限制,任何大小的chunk都可以归属到unsorted bin中。
      • unsortedbin采用的遍历顺序是FIFO。

    六、Small Bin

    • 概念:小于1024字节(0x400)的chunk称之为small chunk,small bin就是用于管理small chunk的。
    • small bin链表的个数为62个。
    • 就内存的分配和释放速度而言,small bin比larger bin快,但比fast bin慢。
    • 合并操作:相邻的free chunk需要进行合并操作,即合并成一个大的free chunk。具体操作见下文free(small chunk)介绍。

    Small Bin链表的特性

    • 每个smallbin也是一个由对应free chunk组成的循环双链表。
    • small bin采用FIFO(先入先出)算法:内存释放操作就将新释放的chunk添加到链表的front end(前端),分配操作就从链表的rear end(尾端)中获取chunk。
    • 单个smallbin链表中的chunk大小都是相同的,各个smallbin链表中的chunk大小是不同的,跟fastbinsY数组存储fastbin链的原理是相同的。
    • bins数组存储small bin链时:第一个small bin链中chunk的大小为32字节,后续每个small bin中chunk的大小依次增加两个机器字长(32位相差8字节,64位相差16字节).......以此类推,跟fastbinsY数组存储fastbin链的原理是相同的(用下图表示)。
    • bin链存储的大小与数组下标的关系:chun_size=2*SIZE_SZ*index。

    malloc操作与small bin的初始化

    • 类似于fast bins,最初所有的small bin都是空的,因此在对这些small bin完成初始化之前,即使用户请求的内存大小属于small chunk也不会交由small bin进行处理,而是交由unsorted bin处理。
    • 如果unsorted bin也不能处理的话,glibc malloc就依次遍历后续的所有bins,找出第一个满足要求的bin,如果所有的bin都不满足的话,就转而使用top chunk,如果top chunk大小不够,那么就扩充top chunk,这样就一定能满足需求了。
    • 注意遍历后续bins以及之后的操作同样被large bin所使用,因此,将这部分内容放到large bin的malloc操作中加以介绍。
    • 那么glibc malloc是如何初始化这些bins的呢?因为这些bin属于malloc_state结构体,所以在初始化malloc_state的时候就会对这些bin进行初始化,代码如下:
      • 将bins数组中的第一个成员索引值设置为了1,而不是我们常用的0(在bin_at宏中,自动将i进行了减1处理)。
      • 从上面代码可以看出在初始化的时候glibc malloc将所有bin的指针都指向了自己——这就代表这些bin都是空的。
    static void
    malloc_init_state (mstate av)
    {
        int i;
        mbinptr bin;
        
        /* Establish circular links for normal bins */
        for (i = 1; i < NBINS; ++i)
        {
            bin = bin_at (av, i);
            bin->fd = bin->bk = bin;
        }
    
        ......
    }
    • 过后,当再次调用malloc(small chunk)的时候,如果该chunk size对应的small bin不为空,就从该small bin链表中取得small chunk给malloc使用。

    free操作

    • small的free比较特殊。当释放small chunk的时候,先检查该chunk相邻的chunk是否为free,如果是的话就进行合并操作:将这些chunks合并成新的chunk,然后将它们从small bin中移除,最后将新的chunk添加到unsorted bin中,之后unsorted bin进行整理再添加到对应的bin链上(后面会有图介绍)。

    七、Large Bin

    • 概念:大于等于1024字节(0x400)的chunk称之为large chunk,large bin就是用于管理这些largechunk的。
    • large bin链表的个数为63个,被分为6组。
    • largechunk使用fd_nextsize、bk_nextsize连接起来的。
    • 合并操作:类似于small bin。

    Large Bin链表的特性

    • 同一个largebin中每个chunk的大小可以不一样,这些chunk根据一定的范围存储在一个larbin链表中。
    • large chunk可以添加、删除在large bin的任何一个位置。
    • 在这63个largebins中:第一组的32个largebin链依次以64字节步长为间隔,即第一个largebin链中chunksize为1024-1087字节,第二个large bin中chunk size为1088~1151字节。第二组的16个largebin链依次以512字节步长为间隔;第三组的8个largebin链以步长4096为间隔;第四组的4个largebin链以32768字节为间隔;第五组的2个largebin链以262144字节为间隔;最后一组的largebin链中的chunk大小无限制。

    • 在同一个largebin中:每个chunk的大小不一定相同,因此为了加快内存分配和释放的速度,就将同一个largebin中的所有chunk按照chunksize进行从大到小的排列:最大的chunk放在一个链表的front end,最小的chunk放在rear end;相同大小的chunk按照最近使用顺序排序。

    链表索引宏定义:(largebin_index)

    • 参数为链表能存储的chunk大小,宏定义中有简介调用其他宏定义。
    • 例如:第一个largebin的起始大小为1024,那么1024>>6=16,所以其在bins数组中的下标为48+16=64。

    malloc操作与large bin的初始化

    • 初始化完成之前的操作类似于small bin。
    • 下面讨论large bins初始化完成之后的操作:
      • 首先确定用户请求的大小属于哪一个large bin,然后判断该large bin中最大的chunk的size是否大于用户请求的size(只需要对比链表中front end的size即可)。如果大于,就从rear end开始遍历该large bin,找到第一个size相等或接近的chunk,分配给用户。如果该chunk大于用户请求的size的话,就将该chunk拆分为两个chunk:前者返回给用户,且size等同于用户请求的size;剩余的部分做为一个新的chunk添加到unsorted bin中。
      • 如果该large bin中最大的chunk的size小于用户请求的size的话,那么就依次查看后续的large bin中是否有满足需求的chunk,不过需要注意的是鉴于bin的个数较多(不同bin中的chunk极有可能在不同的内存页中),如果按照上一段中介绍的方法进行遍历的话(即遍历每个bin中的chunk),就可能会发生多次内存页中断操作,进而严重影响检索速度,所以glibc malloc设计了Binmap结构体来帮助提高bin-by-bin检索的速度。Binmap记录了各个bin中是否为空,通过bitmap可以避免检索一些空的bin。如果通过binmap找到了下一个非空的large bin的话,就按照上一段中的方法分配chunk,否则就使用top chunk来分配合适的内存。

    free操作

    • 类似于small chunk。

    • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

    展开全文
  • mysql-connector-java-5.1.32-bin.jar

    热门讨论 2014-09-10 22:11:35
    5.6.20 最新JDBC mysql-connector-java-5.1.32-bin.jar
  • bin excel两种文件互相转换

    热门讨论 2012-12-05 13:12:12
    bin excel两种文件互相转换。利用C#编写,主要提供给开发人员使用,可以将bin与xls文件互相转换。 因为xls便于查看,如果xls会使用函数的,可以在xls中再增加函数实现数据计算处理。
  • BIN解包工具,做ROM必备

    热门讨论 2013-06-25 16:48:14
    BIN解包工具,做ROM必备
  • mysql-connector-java-5.1.38-bin.jar

    千次下载 热门讨论 2015-12-15 14:18:11
    mysql 的jdbc 驱动。mysql-connector-java-5.1.38-bin.jar
  • bin文件查看修改器

    千次下载 热门讨论 2012-05-18 18:02:29
    网络上看到了的一bin文件修改查看器,用于查看和修改BIOSS信息及其它BIN文件
  • python bin文件处理

    万次阅读 多人点赞 2019-07-11 23:36:11
    文章目录python bin文件处理小记软件准备bin文件读取bin文件写入bin文件的大小端写入bin文件的写0bin文件的写1bin文件的合并bin文件写入字符串 软件准备 python 版本 Python 3.7.1 大概花费时间:3天半抽空学习的...

    在下这厢有礼了

    0. 软件准备

    python 版本 Python 3.7.1
    大概花费时间:3天半抽空学习的知识分享

    bin文件查看器:https://pan.baidu.com/s/1_XebNTlh052zt5Xa58xDMQ 提取码:f4uj

    生bin的工具我就不提供了,你自己找找吧!

    1. 基础知识掌握

    bin文件: open函数创建file对象

    打开文件的不同模式:例子:open(“file.txt”,‘r’)

    模式描述
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    t文本默认
    x写模式,新建一个文件,如果该文件存在,则会报错。
    b二进制模式
    +打开一个文件进行更新(可读可写)。

    bin文件的python struct库 读写属性

    a = struct.pack('B',0x00) 
    b = struct.unpack(‘B’,a)
    这块可以使用python编译的看一下哦!(你就明白了)
    
     1. struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,
     可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, ...),
     参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, ...表示要转换的python值。
    
     2. struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的
     函数原型为:struct.unpack(fmt, string),该函数返回一个元组
    
    FormatC TypePython字节数
    xpad byteno value1
    ccharstring of length 11
    bsigned charinteger1
    Bunsigned charinteger1
    ?_Boolbool1
    hshortinteger2
    Hunsigned shortinteger2
    iintinteger4
    Iunsigned intinteger or long4
    llonginteger4
    Lunsigned longlong4
    qlong longlong8
    Qunsigned long longlong8
    ffloatfloat4
    ddoublefloat8
    schar[]string1
    pchar[]string1
    Pvoid *long

    这快就类似于C语言中的字节对齐,大小端的选择

    例子:(后面有说明)
    a = struct.pack('<I',0x12345678)  #四字节存入,按小端存储
    b = struct.pack('>I',0x12345678)  #四字节存入,按大端存储
    
    CharacterByte orderSize and alignment
    @nativenative 凑够4个字节
    =nativestandard 按原字节数
    <little-endianstandard 按原字节数
    >big-endianstandard 按原字节数
    !network (= big-endian)standard 按原字节数

    2. bin文件的打开和模式

    file = open(file_name,'wb')#二进制写模式
    file = open(file_name,'rb')#二进制读模式
    file = open(file_name,'ab')#二进制补充读写模式
    
    

    3. bin文件读取

    import struct
    import os
    
    def ReadFile():
        filepath='7.bin'
        binfile = open(filepath, 'rb') #打开二进制文件
        size = os.path.getsize(filepath) #获得文件大小
        for i in range(size):
            data = binfile.read(1) #每次输出一个字节
            print(data)
        binfile.close()
    if __name__ == '__main__':
    	ReadFile()
    

    7.bin文件如下
    在这里插入图片描述
    效果图
    在这里插入图片描述

    4. bin文件写入

    import struct
    import os
    
    def WriteFile():
        filepath='7.bin'
        data = 123
        binfile = open(filepath, 'ab+') #打开二进制文件(追加完成)
        a = struct.pack('B',data)
        binfile.write(a)
        binfile.close()
    if __name__ == '__main__':
    	WriteFile()
    

    7.bin文件
    在这里插入图片描述
    效果图
    在这里插入图片描述

    5. bin文件的大小端写入

    import struct
    
    file_name = "5.bin"
    def Big_little_endian():
        file = open(file_name,'wb')
        a = struct.pack('I',0x12345678)  #四字节存入,正常状态
        b = struct.pack('<I',0x12345678)  #四字节存入,按小端存储
        c = struct.pack('>I',0x12345678)  #四字节存入,按大端存储
        file.write(a)
        file.write(b)
        file.write(c)
        file.close()
       
    if __name__ == '__main__':
        Big_little_endian()
    

    效果图

    在这里插入图片描述

    6. bin文件的写0

    import struct
    
    bin_file_1 = "1.bin"
    
    def write0x00():
        file = open(bin_file_1,'wb')
        for i in range(1,0xFF):   
            data = struct.pack('B',0x00)  #写0
            file.write(data)
        file.close
    
    if __name__ == '__main__':
        write0x00()
    

    效果图:

    在这里插入图片描述

    7. bin文件的写1

    import struct
    
    bin_file_2 = "2.bin"
    
    def write0xFF():
        file = open(bin_file_2,'wb')
        for i in range(0,0xFF):   
            data = struct.pack('B',0xFF)  #写1
            file.write(data)
        file.close
    
    if __name__ == '__main__':
        write0x00()
    

    效果图:
    在这里插入图片描述

    8. bin文件的合并

    1.bin和2.bin合并成merage.bin

    import struct
    
    bin_file_1 = "1.bin"
    bin_file_2 = "2.bin"
    bin_file_merage = "merage.bin"
    
    def merage_bin():
        file_merage = open(bin_file_merage,'wb')
        file_1 = open(bin_file_1,'rb')
        data = file_1.read()
        file_merage.write(data)    
        file_2 = open(bin_file_2,'rb')
        data = file_2.read()
        file_merage.write(data)
        file_1.close()
        file_2.close()
        file_merage.close()
        
    if __name__ == '__main__':
        merage_bin()
    

    效果图:
    在这里插入图片描述

    9. bin文件写入字符串

    import struct
    import string
    
    bin_file_1 = "7.bin"
    
    enter = memoryview(b"STARTX") #返回值是元组
    
    def writeString():
        file = open(bin_file_1,'wb')
        for i in enter:
            data = struct.pack('B',i)
            file.write(data)
        file.close
    
    if __name__ == '__main__':
        writeString()
    

    效果图:

    在这里插入图片描述

    学习:

    1. https://blog.csdn.net/and_then111/article/details/86744938
    2. python手册
    展开全文
  • bin文件转txt工具

    热门讨论 2011-12-14 11:21:36
    该工具可以将bin文件转为txt文件,很好用!
  • linux———/bin/sh、 /bin/bash、 /bin/dash的区别

    万次阅读 多人点赞 2019-03-01 09:50:26
    ksh(Korn Shell):由David Korn开发,向后兼容sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系统标准配置的Shell,在这些系统上/bin/sh往往是指向/bin/ksh的符号链接。 tcsh(TENEX C Shell):是csh的...

    bash

    bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。

    bash (GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell 。事实上,还有许多传统UNIX上用的Shell,例如tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同。
    由于历史原因,UNIX系统上有很多种Shell:

    csh(C Shell):由Bill Joy开发,随BSD UNIX发布,它的流程控制语句很像C语言,支持很多Bourne Shell所不支持的功能:作业控制,命令历史,命令行编辑。

    ksh(Korn Shell):由David Korn开发,向后兼容sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系统标准配置的Shell,在这些系统上/bin/sh往往是指向/bin/ksh的符号链接。

    tcsh(TENEX C Shell):是csh的增强版本,引入了命令补全等功能,在FreeBSD、Mac OS X等系统上替代了csh。

    bash(Bourne Again Shell):由GNU开发的Shell,主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

    可使用cat /etc/shells 指令查看自己系统可以使用的shell种类:
    在这里插入图片描述
    用户的默认Shell设置在/etc/passwd文件中,例如: vim /etc/passwd
    在这里插入图片描述

    sh

    在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。
    目前常见的shell脚本中主要有以下两种方式:
    (1) #!/bin/sh
    (2) #!/bin/bash

    注意:每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。
    sh是bash的一种特殊的模式,也就是 /bin/sh 相当于 /bin/bash --posix。说白了sh就是开启了POSIX标准的bash 。
    在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
    sh一般设成bash的软链:
    在这里插入图片描述
    怎么把sh改为指向bash呢?
    直接把/bin/sh的软链接改到bash中,
    如:ln -s /bin/bash /bin/sh
    方法二:配置shell
    sudo dpkg-reconfigure dash

    dash

    但鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash(Debian Almquist Shell),并以获得更快的脚本执行速度。Debian Almquist shell,缩写为dash,一种 Unix shell。它比 Bash 小,只需要较少的磁盘空间,但是它的对话性功能也较少。它由 NetBSD版本的Almquist shell (ash)发展而来,于1997年,由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为 dash。

    ll -h /bin/
    

    在这里插入图片描述
    在这里插入图片描述
    可以看见,bash大小为1014k,而dash空间减少到151k。

    那么怎么把sh改为指dash呢?

    sudo dpkg-reconfigure dash
    

    选择yes使用dash作为默认的shell即可修改为dash。
    在这里插入图片描述

    具体#!/bin/bash和#!/bin/sh等的使用区别参考:关于#!/bin/bash和#!/bin/sh

    #!/bin/bash是指此脚本使用/bin/bash来解释执行。
    其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
    bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,…
    我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。
    除第一行外,脚本中所有以“#”开头的行都是注释。
    1)#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。
    这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来获得可执行权限):
    tbash1.sh:
    #!/bin/sh
    source abc
    echo “hello abc”

    tbash2.sh:
    #!/bin/bash
    source abc
    echo “hello abc”

    tbash3.sh:
    source abc
    echo “hello abc”

    三个脚本执行的结果:
    [nsvc@localhost other]$ ./tbash1.sh
    ./tbash1.sh: line 2: abc: No such file or directory
    注:当source命令执行有问题时,sh不再往下面执行。
    [nsvc@localhost other]$ ./tbash2.sh
    ./tbash2.sh: line 2: abc: No such file or directory
    hello abc
    注:当source命令执行有问题时,bash继续执行下面命令。
    [nsvc@localhost other]$ ./tbash3.sh
    ./tbash3.sh: line 1: abc: No such file or directory
    hello abc
    注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。

    如果将tbash1.sh改成:
    echo “abc”
    #!/bin/sh
    source abc
    echo “hello abc”
    那么,执行结果是:
    [nsvc@localhost other]$ ./tbash1.sh
    abc
    ./tbash1.sh: line 3: abc: No such file or directory
    hello abc
    也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。

    当把tbash1.sh改成:
    #!/bin/sh
    #!/bin/bash
    source abc
    echo “hello abc”
    执行结果为:
    [nsvc@localhost other]$ ./tbash1.sh
    ./tbash1.sh: line 3: abc: No such file or directory
    当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,除第一行外,脚本中所有以“#”开头的行都是注释。

    2)#!后面的路径一定要正确,不正确会报错。
    假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:
    #!/home/sh
    source abc
    echo “hello abc”
    执行结果为:
    [nsvc@localhost other]$ ./tbash1.sh
    -bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory
    系统会提示/home/sh的路径不存在。

    3)如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
    在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:
    -sh-3.2$ ./tbash3.sh
    ./tbash3.sh: line 1: abc: 没有那个文件或目录
    与1)中的执行结果是不一样的。
    因此,大家应该养成脚本首行加上#!+shell路径的习惯。

    4)/bin/sh相当于/bin/bash --posix
    我们将脚本tbash1.sh改为:
    #!/bin/bash --posix
    source abc
    echo “hello abc”
    执行结果:
    [nsvc@localhost other]$ ./tbash1.sh
    ./tbash1.sh: line 2: abc: No such file or directory
    与tbash1.sh原脚本执行的结果一样。

    我们还可以以tbash3.sh为示例。
    用以下命令来执行该脚本:
    [nsvc@localhost other]$ bash tbash3.sh
    tbash3.sh: line 1: abc: No such file or directory
    hello abc
    [nsvc@localhost other]$ sh tbash3.sh
    tbash3.sh: line 1: abc: No such file or directory
    [nsvc@localhost other]$ bash --posix tbash3.sh
    tbash3.sh: line 1: abc: No such file or directory
    "bash tbash3.sh"表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh脚本名“这样的命令,来用sh作为脚本解释器。
    从结果可以看出,/bin/bash–posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“

    最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。

    展开全文
  • bmp图片转换成bin文件

    热门讨论 2012-02-24 16:50:27
    BMP2RAW将bmp图片转换为bin文件,同时生产.c文件!
  • jdk-6u45-linux-x64-rpm.bin

    千次下载 热门讨论 2014-12-28 13:44:43
    jdk-6u45-linux-x64-rpm.bin //linux jdk 1.6 for X64
  • 关于#!/bin/bash和#!/bin/sh

    万次阅读 2018-12-13 11:37:52
    /bin/bash是指此脚本使用/bin/bash来解释执行。 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。 bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,... 我们可以通过以下一个示例来...

    #!/bin/bash是指此脚本使用/bin/bash来解释执行

    其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径

    bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,...

    我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。

    除第一行外,脚本中所有以“#”开头的行都是注释。

    1)#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释

    这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来获得可执行权限):

    tbash1.sh:

    #!/bin/sh

    source abc

    echo "hello abc"

     

    tbash2.sh:

    #!/bin/bash

    source abc

    echo "hello abc"

     

    tbash3.sh:

    source abc

    echo "hello abc"

     

    三个脚本执行的结果:

    [nsvc@localhost other]$ ./tbash1.sh 

    ./tbash1.sh: line 2: abc: No such file or directory

    注:当source命令执行有问题时,sh不再往下面执行。

    [nsvc@localhost other]$ ./tbash2.sh 

    ./tbash2.sh: line 2: abc: No such file or directory

    hello abc

    注:当source命令执行有问题时,bash继续执行下面命令。

    [nsvc@localhost other]$ ./tbash3.sh 

    ./tbash3.sh: line 1: abc: No such file or directory

    hello abc

    注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。

     

    如果将tbash1.sh改成:

    echo "abc"

    #!/bin/sh

    source abc

    echo "hello abc"

    那么,执行结果是:

    [nsvc@localhost other]$ ./tbash1.sh 

    abc

    ./tbash1.sh: line 3: abc: No such file or directory

    hello abc

    也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。

     

    当把tbash1.sh改成:

    #!/bin/sh

    #!/bin/bash

    source abc

    echo "hello abc"

    执行结果为:

    [nsvc@localhost other]$ ./tbash1.sh 

    ./tbash1.sh: line 3: abc: No such file or directory

    当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,除第一行外,脚本中所有以“#”开头的行都是注释。

     

    2)#!后面的路径一定要正确,不正确会报错。

    假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:

    #!/home/sh

    source abc

    echo "hello abc"

    执行结果为:

    [nsvc@localhost other]$ ./tbash1.sh 

    -bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory

    系统会提示/home/sh的路径不存在。

     

    3)如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。

    在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:

    -sh-3.2$ ./tbash3.sh 

    ./tbash3.sh: line 1: abc: 没有那个文件或目录

    与1)中的执行结果是不一样的。

    因此,大家应该养成脚本首行加上#!+shell路径的习惯。

     

    4)/bin/sh相当于/bin/bash --posix

    我们将脚本tbash1.sh改为:

    #!/bin/bash --posix

    source abc

    echo "hello abc"

    执行结果:

    [nsvc@localhost other]$ ./tbash1.sh 

    ./tbash1.sh: line 2: abc: No such file or directory

    与tbash1.sh原脚本执行的结果一样。

     

    我们还可以以tbash3.sh为示例。

    用以下命令来执行该脚本:

    [nsvc@localhost other]$ bash tbash3.sh

    tbash3.sh: line 1: abc: No such file or directory

    hello abc

    [nsvc@localhost other]$ sh tbash3.sh 

    tbash3.sh: line 1: abc: No such file or directory

    [nsvc@localhost other]$ bash --posix tbash3.sh 

    tbash3.sh: line 1: abc: No such file or directory

     "bash tbash3.sh"表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh脚本名“这样的命令,来用sh作为脚本解释器。

    从结果可以看出,/bin/bash--posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“

     

    最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。

    #!/bin/bash是指此脚本使用/bin/bash来解释执行。

    其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。

    bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,...

    我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。

    除第一行外,脚本中所有以“#”开头的行都是注释。

    1)#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。

    这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来获得可执行权限):

    tbash1.sh:

    #!/bin/sh

    source abc

    echo "hello abc"

     

    tbash2.sh:

    #!/bin/bash

    source abc

    echo "hello abc"

     

    tbash3.sh:

    source abc

    echo "hello abc"

     

    三个脚本执行的结果:

    [nsvc@localhost other]$ ./tbash1.sh 

    ./tbash1.sh: line 2: abc: No such file or directory

    注:当source命令执行有问题时,sh不再往下面执行。

    [nsvc@localhost other]$ ./tbash2.sh 

    ./tbash2.sh: line 2: abc: No such file or directory

    hello abc

    注:当source命令执行有问题时,bash继续执行下面命令。

    [nsvc@localhost other]$ ./tbash3.sh 

    ./tbash3.sh: line 1: abc: No such file or directory

    hello abc

    注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。

     

    如果将tbash1.sh改成:

    echo "abc"

    #!/bin/sh

    source abc

    echo "hello abc"

    那么,执行结果是:

    [nsvc@localhost other]$ ./tbash1.sh 

    abc

    ./tbash1.sh: line 3: abc: No such file or directory

    hello abc

    也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。

     

    当把tbash1.sh改成:

    #!/bin/sh

    #!/bin/bash

    source abc

    echo "hello abc"

    执行结果为:

    [nsvc@localhost other]$ ./tbash1.sh 

    ./tbash1.sh: line 3: abc: No such file or directory

    当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,除第一行外,脚本中所有以“#”开头的行都是注释。

     

    2)#!后面的路径一定要正确,不正确会报错。

    假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:

    #!/home/sh

    source abc

    echo "hello abc"

    执行结果为:

    [nsvc@localhost other]$ ./tbash1.sh 

    -bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory

    系统会提示/home/sh的路径不存在。

     

    3)如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。

    在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:

    -sh-3.2$ ./tbash3.sh 

    ./tbash3.sh: line 1: abc: 没有那个文件或目录

    与1)中的执行结果是不一样的。

    因此,大家应该养成脚本首行加上#!+shell路径的习惯。

     

    4)/bin/sh相当于/bin/bash --posix

    我们将脚本tbash1.sh改为:

    #!/bin/bash --posix

    source abc

    echo "hello abc"

    执行结果:

    [nsvc@localhost other]$ ./tbash1.sh 

    ./tbash1.sh: line 2: abc: No such file or directory

    与tbash1.sh原脚本执行的结果一样。

     

    我们还可以以tbash3.sh为示例。

    用以下命令来执行该脚本:

    [nsvc@localhost other]$ bash tbash3.sh

    tbash3.sh: line 1: abc: No such file or directory

    hello abc

    [nsvc@localhost other]$ sh tbash3.sh 

    tbash3.sh: line 1: abc: No such file or directory

    [nsvc@localhost other]$ bash --posix tbash3.sh 

    tbash3.sh: line 1: abc: No such file or directory

     "bash tbash3.sh"表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh脚本名“这样的命令,来用sh作为脚本解释器。

    从结果可以看出,/bin/bash--posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“

     

    最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。

    展开全文
  • #!/bin/bash 和 #!/usr/bin/env bash 的区别

    千次阅读 多人点赞 2020-05-18 01:21:02
    文章中这样提到: 当你执行 env python 时,它其实会去 env | grep PATH 里(也就是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)这几个路径里去依次查找名为 python 的可执行文件。 那么,我们...
  • jdk-6u45-linux-i586-rpm.bin

    千次下载 热门讨论 2014-12-28 12:40:58
    jdk-6u45-linux-i586-rpm.bin //linux jdk 1.6 x86
  • 这样执行命令:ln -f -s /bin/sh /bin/bash然后 ln -f -s /bin/bash /bin/sh。 应该没有人会做这样傻子的操作吧~~~??? 嗯,~~~我做了。。。 昨天半夜里干的。 然后,系统崩了,,,我,也崩了。。。 -...
  • BIN文件5M以下转换为txt文件工具bin2txt

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,024,025
精华内容 1,209,610
关键字:

bin