linux – 如何知道要使用的脚本标头及其重要性?
我不经常为各种不相关的目的编写bash脚本,虽然我通常很清楚脚本中我想要什么命令,但我常常不知道使用什么标头或为什么我在找到它时使用它.举些例子):
>标准shell脚本: >#!/ bin / bash > Python: >#!/usr/bin/env python 脚本似乎在没有标题的情况下工作正常,但如果标题是标准的,那么它们就有一个原因,它们不应该被忽略.如果它有效果,那么它是一个有价值的工具,可以用来完成更多. 最简单的说,我想知道MySQL脚本使用什么标头以及标题,Python和MySQL脚本的标题.理想情况下,我想要一个通用的标题列表或理解如何根据正在使用的程序创建标题. 解决方法
内核如何执行事物
简化(有点),POSIX系统中的内核有两种方式知道如何执行程序.一,如果程序是内核理解的二进制格式(例如ELF),内核可以“直接”执行它(更多细节超出范围).如果程序是以shebang开头的文本文件,例如 #!/usr/bin/somebinary -arg 或者你有什么,内核实际上执行命令就像它被指示执行一样: /usr/bin/somebinary -arg "$0" 其中$0这里是您刚刚尝试执行的脚本文件的名称. (所以你可以立即告诉为什么这么多脚本语言使用#作为评论启动器 – 这意味着他们不必将shebang视为特殊的.) PATH和env命令 内核不会查看PATH环境变量来确定您正在讨论的可执行文件,因此如果您要将python脚本分发给可能安装了多个版本的python的系统,则无法保证会有 #!/usr/bin/python 然而,env是POSIX,所以你可以指望它存在,它将在PATH中查找python.从而, #!/usr/bin/env python 将使用PATH中找到的第一个python执行脚本. BASH,SH和调用的特殊含义 有些程序对它们的调用方式有特殊的语义.特别是,在许多系统上/ bin / sh是另一个shell的符号链接,例如/ bin / bash.虽然bash不包含sh的完美POSIXLY_STRICT实现,但当它被调用为/ bin / sh时,它比调用plain-old-bash时更严格. MySQL和arg的局限性 shebang行可以是长度限制的,从技术上讲,它只能支持一个参数,所以mysql有点棘手 – 你不能指望将用户名和数据库名称传递给mysql脚本. #!/usr/bin/env mysql use mydb; select * from mytbl; 将失败,因为内核将尝试mysql“$0”.即使您在.my.cnf文件中拥有凭据,mysql本身也会尝试将“$0”视为数据库名称.同样: #!/usr/bin/mysql -e use mydb; select * from mytbl; 将失败因为再次,“$0”不是表名(你希望). 似乎没有适当的语法以这种方式直接执行mysql脚本.最好的办法是直接将sql命令传递给mysql: mysql < my_sql_commands (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |