本文翻译自:Why do you need to put #!/bin/bash at the beginning of a script file?

I have made Bash scripts before and they all ran fine without this at the beginning. 之前我已经制作了Bash脚本,并且在开始时它们都运行良好。 What's the point of putting it in? 把它放进去有什么意义? Would things be any different? 会有什么不同吗?

Also, how do you pronounce # ? 另外,你怎么发音# I know that ! 我知道! is pronounced as "bang." 发音为“bang”。

How is #! 怎么#! pronounced? 发音?


#1楼

参考:https://stackoom.com/question/bcxa/为什么需要在脚本文件的开头加上-bin-bash


#2楼

It can be useful to someone that uses a different system that does not have that library readily available. 对于使用不具有该库的不同系统的人来说,它可能是有用的。 If that is not declared and you have some functions in your script that are not supported by that system, you should declare #/bin/bash. 如果未声明并且您的脚本中有一些该系统不支持的函数,则应声明#/ bin / bash。 I've ran into this problem before at work and now I just include it as a practice. 我在工作之前遇到过这个问题,现在我只是把它作为一种练习。


#3楼

Also you will see some other parameters after #!/bin/bash, for example 例如,您还会在#!/ bin / bash之后看到一些其他参数
#!/bin/bash -v -x
read this to get more idea. 阅读本文以获得更多想法。
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash . https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash


#4楼

It's a convention so the *nix shell knows what kind of interpreter to run. 这是一个约定,所以* nix shell知道要运行什么样的解释器。

For example, older flavors of ATT defaulted to sh (the Bourne shell), while older versions of BSD defaulted to csh (the C shell). 例如,较旧版本的ATT默认为sh (Bourne shell),而较旧版本的BSD默认为csh (C shell)。

Even today (where most systems run bash, the "Bourne Again Shell" ), scripts can be in bash, python, perl, ruby, PHP, etc, etc. For example, you might see #!/bin/perl or #!/bin/perl5 . 即使在今天(大多数系统运行bash, “Bourne Again Shell” ),脚本也可以是bash,python,perl,ruby,PHP等等。例如,你可能会看到#!/bin/perl#!/bin/perl5

PS: The exclamation mark ( ! ) is affectionately called "bang" . PS:感叹号( ! )被亲切地称为“爆炸” The shell comment symbol ( # ) is sometimes called "hash" . shell注释符号( # )有时称为“哈希”

PPS: Remember - under *nix, associating a suffix with a file type is merely a convention , not a "rule" . PPS:记住 - 在* nix下,将后缀与文件类型相关联仅仅是一种约定 ,而不是“规则” An executable can be a binary program, any one of a million script types and other things as well. 可执行文件可以是二进制程序,也可以是一百万种脚本类型中的任何一种。 Hence the need for #!/bin/bash . 因此需要#!/bin/bash


#5楼

The operating system takes default shell to run your shell script. 操作系统使用默认shell来运行shell脚本。 so mentioning shell path at the beginning of script, you are asking the OS to use that particular shell. 所以在脚本开头提到shell路径,你要求OS使用那个特定的shell。 It is also useful for portability . 它对于便携性也很有用。


#6楼

Every distribution has a default shell. 每个发行版都有一个默认shell。 Bash is the default on the majority of the systems. Bash是大多数系统的默认设置。 If you happen to work on a system that has a different default shell, then the scripts might not work as intended if they are written specific for Bash. 如果您碰巧在具有不同默认shell的系统上工作,那么如果脚本是针对Bash编写的,则脚本可能无法正常工作。

Bash has evolved over the years taking code from ksh and sh . 多年来,Bash从kshsh获取代码。

Adding #!/bin/bash as the first line of your script, tells the OS to invoke the specified shell to execute the commands that follow in the script. 添加#!/bin/bash作为脚本的第一行,告诉操作系统调用指定的shell来执行脚本中的命令。

#! is often referred to as a "hash-bang", "she-bang" or "sha-bang". 通常被称为“哈希砰”,“嘻嘻”或“沙梆”。

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux31074 人正在系统学习中

[转帖]为什么需要在脚本文件的开头加上#!/ bin / bash?的更多相关文章

  1. linux shell脚本中的开头#!/bin/bash的含义

    对于linux上需要执行 的shell脚本,通常第一行的内容是 #!/bin/bash 当然有很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 .. 这只是因为在我们常用 ...

  2. 在caffe中执行脚本文件时 报错:-bash: ./train.sh: Permission denied

    报错原因:没有权限 解决方法:chmod 777 train.sh获得权限

  3. Shell中 调用/引用/包含 另外的脚本文件的两种方法

    脚本 first (测试示例1) #!/bin/bash echo 'your are in first file' 问)在当前脚本文件中调用另外一个脚本文件? 方法一: 使用 source 脚本 s ...

  4. shell脚本--文件包含

    首先介绍一下shell中包含文件的方法,在C,C++,PHP中都是用include来包含文件,Go和Java使用import来包含(导入)包,而在shell中,很简单,只需要一个点“.”,然后跟着文件 ...

  5. tecplot 脚本文件

    一个简单的C++代码,可以生成tecplot的脚本文件,打开文件就能自动绘图.绘图过程是先把文件导入,然后镜像,最后生成一个动画,但是导入的文件名称要求是有规律的. /* ** This progra ...

  6. Maven打包生成可运行bat/sh脚本文件

    利用Maven的appassembler-maven-plugin插件,就可以实现自动打包可运行的脚本,还可以跨平台.   <plugin>      <groupId>org ...

  7. 获取当前正在执行的Javascript脚本文件的路径

    获取当前JavaScript脚本文件的路径,在特定场景下可能需要,比如写模块加载器,或者进行日志记录.下面这段脚本适用于所有浏览器来获取正在执行js文件的路径,但是该方法只适用于脚本加载过程中执行的情 ...

  8. MS SQL执行大脚本文件时,提示“内存不足”的解决办法()

    问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行 ...

  9. SqlCommand执行带GO的SQL脚本文件

    今天工作中遇到了这个问题,其实只要把GO替换成“;”就行了,其它人写的例子用Split来拆分这一个脚本文件的内容,完全没有必要.希望对你有用.

  10. linux执行sh脚本文件命令

    linux执行sh脚本文件命令 很多时候需要多个命令来完成一项工作,而这个工作又常常是重复的,这个时候我们自然会想到将这些命令写成sh脚本,下次执行下这个脚本一切就都搞定了,下面就是发布代码的一个脚本 ...

随机推荐

  1. macOS 安装 clang-tidy

    先安装 homebrew,网上教程很多,推荐官方教程,此处略过 通过 brew 安装 llvm brew install llvm 创建软连接,指向 homebrew 安装的 clang-tidy m ...

  2. 启动多个redis进程

    启动时指定端口 启动时指定端口可在一台服务器启动多个redis进程 cd /opt/work/redis/bin./redis-server ../conf/redis.conf --port 638 ...

  3. hiveSQL常见专题

    SQL强化 SQL执行顺序 --举例: select a.sex, b.city, count(1) as cnt, sum(salary) as sum1 from table1 a join ta ...

  4. windows环境下如何优雅搭建ftp服务?

    目录 0. 前言 1.ftp简介 2.下载Apache FTPServer 3.下载并解压压缩包 4.修改配置文件 4.1 修改users.properties配置文件 4.2 修改ftpd-typi ...

  5. 理论+实践详解最热的LLM应用框架LangChain

    本文分享自华为云社区<LangChain是什么?LangChain的详细介绍和使用场景>,作者:码上开花_Lancer . 一.概念介绍 1.1 Langchain 是什么? 官方定义是: ...

  6. 玩转GaussDB 中的SET操作符

    摘要:关系数据库中提供了一个关于集合的运算符SET操作符,其中包括以下操作:UNION/UNION ALL 并集.INTERSECT 交集.MINUS 差集. 本文分享自华为云社区<GaussD ...

  7. 六一儿童节,看我用ModelArts让8090梦回童年

    [本期推荐] 8岁小朋友的儿童节,有点硬核,一起来认识这些小小程序员,看他们如何coding出一个与众不同的童年. 摘要: 如果还能再过一次儿童节-- 本文分享自华为云社区<"梦回童年 ...

  8. hadoop清空回收站命令

    直接删除目录(不放入回收站) hdfs dfs -rm -skipTrash /tmp/aaa 清空回收站 hdfs dfs -expunge 执行完命令后,回收站的数据会在一分钟后清除.

  9. RPC 框架性能测试,注意这 8 点就够了

    某天,二狗子写了一个 RPC 框架后,简单测了一下性能,发现超出 grpc 一大截.二狗子一高兴,忍不住找同事吹了一波.结果,同事亲测后对二狗子说框架性能也就这样.二狗子表示不服,跟同事一番唇枪舌剑后 ...

  10. nginx: [emerg] duplicate upstream "test2" in /usr/local/nginx/conf/sites-enabled/test2.conf:1

    使用/usr/local/nginx/sbin/nginx -t 检查nginx配置文件时报错: nginx: [emerg] duplicate upstream "test2" ...