如何知道要使用的脚本标头及其重要性?

Sti*_*ony 3 linux bash shell scripting

我不经常为各种不相关的目的编写bash脚本,虽然我通常很清楚脚本中我想要什么命令,但我常常不知道使用什么标头或为什么我在找到它时使用它.举些例子):

  • 标准shell脚本:
    • #!/bin/bash
  • 蟒蛇:
    • #!/usr/bin/env python

脚本似乎在没有标题的情况下工作正常,但如果标题是标准的,那么它们就有一个原因,它们不应该被忽略.如果它有效果,那么它是一个有价值的工具,可以用来完成更多.

最简单的说,我想知道MySQL脚本使用什么标头以及标题,Python和MySQL脚本的标题.理想情况下,我想要一个通用的标题列表或理解如何根据正在使用的程序创建标题.

koj*_*iro 7

内核如何执行事物

简化(有点),POSIX系统中的内核有两种方式知道如何执行程序.一,如果程序是内核理解的二进制格式(例如ELF),内核可以"直接"执行它(更多细节超出范围).如果程序是以shebang开头的文本文件,例如

#!/usr/bin/somebinary -arg
Run Code Online (Sandbox Code Playgroud)

或者你有什么,内核实际上执行命令就像它被指示执行一样:

/usr/bin/somebinary -arg "$0"
Run Code Online (Sandbox Code Playgroud)

其中,$0这里是你只是试图执行脚本文件的名称.(因此,您可以立即告诉为什么这么多脚本语言#用作评论启动器 - 这意味着他们不必将shebang视为特殊.)

PATH和env命令

内核不会查看PATH环境变量来确定您正在讨论的可执行文件,因此如果您要将python脚本分发给可能安装了多个版本的python的系统,则无法保证会有

#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

env但是,它是POSIX,所以你可以指望它存在,它将在PATH中查找python.从而,

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

将使用PATH中找到的第一个python执行脚本.

BASH,SH和调用的特殊含义

有些程序对它们的调用方式有特殊的语义.特别是,在许多系统上/bin/sh是另一个shell的符号链接,例如/bin/bash.虽然bash不包含一个完美的POSIXLY_STRICT实现sh,但是当它被调用时,因为/bin/sh它比调用plain-old 更严格bash.

MySQL和arg的局限性

shebang行可以是长度限制的,从技术上讲,它只能支持一个参数,所以mysql有点棘手 - 你不能指望将用户名和数据库名称传递给mysql脚本.

#!/usr/bin/env mysql
use mydb;
select * from mytbl;
Run Code Online (Sandbox Code Playgroud)

会失败,因为内核会尝试mysql "$0".即使您在.my.cnf文件中拥有凭据,mysql本身也会尝试将"$ 0"视为数据库名称.同样:

#!/usr/bin/mysql -e
use mydb;
select * from mytbl;
Run Code Online (Sandbox Code Playgroud)

将失败因为再次,"$ 0"不是表名(你希望).

似乎没有适当的语法以这种方式直接执行mysql脚本.最好的办法是直接将sql命令传递给mysql:

mysql < my_sql_commands
Run Code Online (Sandbox Code Playgroud)