在Wikipedia上,.sh的文章说:
有关.sh文件扩展名的类型,请参见Bourne shell。
其他的unix shell怎么样?
我知道在文件内部 使用了shebang来指示要执行的解释器,但是我想知道:
- 文件扩展名与无文件扩展名的优缺点是什么?
在Wikipedia上,.sh的文章说:
有关.sh文件扩展名的类型,请参见Bourne shell。
其他的unix shell怎么样?
我知道在文件内部 使用了shebang来指示要执行的解释器,但是我想知道:
Answers:
我只会叫.sh
的东西是指可移植的(希望是便携式)。
否则,我认为隐藏语言会更好。细心的读者还是会在shebang行中找到它。(在实践中,.bash
或.zsh
后缀等很少使用。)
我要说的是,严格地说,没有技术上的文件扩展名“好习惯”:Unix / Linux / * BSD文件系统本身不支持扩展名。您所说的扩展名只是单个文件名的后缀。这与VM / CMS,VMS,MS-DOS和Windows文件系统和OS有所不同,在VM / CMS,VMS,MS-DOS和Windows文件系统和OS中,等价于inode-moral的特殊位置保留用于扩展。
那个小家伙现在结束了,我认为在外壳程序脚本文件名上加上“ .sh”或“ .ksh”或“ .bash”后缀有点愚蠢。程序就是程序:区分执行的内容没有好处。没有Unix,Linux或任何内核决定仅由于文件名后缀而对某个文件调用解释器。这一切都是通过#!
一行或文件开头的一些其他“魔术数字”字节序列完成的。实际上,基于文件名“扩展名”决定执行什么是使Windows成为恶意软件的诱人因素之一。查看有多少个Windows恶意软件诈骗涉及一个名为“ something.jpg.exe”的文件-默认情况下,较新的Windows不显示“ .exe”扩展名,而是鼓励用户双击“
无论如何,您可能会想到的直接命令通常就是shell脚本。有时cc
是sh脚本,firefox
是sh脚本,startx
是sh脚本。我认为用“ .sh”后缀标记脚本不会带来认知或组织上的好处。
.sh
扩展名,则.sh
在启动它时必须在命令名中键入该扩展名。这就是为什么我不喜欢添加该扩展名的主要原因(与具有shebang线的任何内容相同)。顺便说一句,Windows中的问题不是.exe
前缀本身(image.jpg
毕竟,在Linux中创建可执行文件并不容易),而是Windows通常隐藏该扩展名的事实,以及启动可执行文件所需的操作以及打开文档是完全一样的。
作为在众多nix环境中工作的人,我不得不使用各种各样的shell进行编写。信不信由你,跨平台,外壳是不一样的。因此,如果您在多个外壳中维护个人库(必要时),则使用扩展名对外壳进行标识将非常有帮助。这样,当您转移到另一个平台并且外壳稍有不同时,您就知道要针对哪些脚本进行修改。.sh .ksh .bsh .csh ...
#!
脚本开头是否没有(例如#!/bin/bash
)?
如您所说,Unix文件扩展名纯粹是信息。您只需要脚本具有正确的shebang即可执行。
您可以没有扩展名,也可以使用.sh
。
无论使用哪种shell(csh,tcsh,bash,sh,...),我都亲自使用以下约定:
.sh
对经典段子,从低到高档次。您不应该对可执行文件使用扩展名,因为它们不可互换。假设您有一个shell脚本a.sh
,然后用python重新编写a.py
,现在您必须更改每个调用您脚本的程序,并且泄漏了实现细节。
在Mircosoft的Windows中,整个文件扩展名都是一团糟:例如,可能是a.audio, b.audio, c.audio
,是a.mp3, b.wav, c.ogg
和d.picture, e.picture, f.picture
是d.jpeg, e.png, f.gif
。大多数时候,我们不在乎音频或图片的格式。我们还必须花很长时间教新用户所有文件扩展名。
*.sh
我刚遇到的另一个不使用的原因是Debian run-parts
不会运行带有扩展名的脚本,例如/etc/cron.*/
: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Shell脚本扩展非常有用。例如,我经常编写在同一目录中具有多种语言(例如bash,awk和lua)的多个文件的脚本。如果只需要在bash文件中搜索字符串,该扩展名将非常方便,以减少误报。或者,如果我想对该项目的所有bash代码进行行计数。
在运行程序时必须键入扩展名是一件很痛苦的事,因此我也进行了没有扩展名到主要可执行文件的符号链接,以编辑/运行它而无需每次都键入扩展名。符号链接既便宜又容易。
bash script.sh
(或sh
当然)运行它们。