什么是 .sh 文件?

134

我对处理各种文件类型并不熟悉,也没有找到太多关于.sh文件的信息。以下是我的尝试:

我想下载以瓦片形式排列的地图数据集,可以逐个下载:http://daymet.ornl.gov/gridded

为了一次性下载一系列瓦片,它们建议下载一个脚本,最终导致daymet-nc-retrieval.shhttps://github.com/daymet/scripts/blob/master/Bash/daymet-nc-retrieval.sh

那么,我应该如何使用这段代码呢?该网站没有提供进一步的说明,假定用户知道该怎么用它。我猜想你应该将代码粘贴到某个未经提及的浏览器应用程序中(在这种情况下使用Chrome或Firefox)?它看起来几乎可以粘贴到Firefox/Greasemonkey中,但也不完全相同。通过快速谷歌这个文件类型,我还不能理解它。

我相信有一个简单的解释来说明如何操作这些文件,但似乎被淹没在许多帖子中,这些帖子已经假定您知道如何操作这些文件。是否有人愿意简单地说一下从打开页面到实际实施所需的步骤?谢谢。


12
.sh 扩展名是用于 shell 脚本文件的。 - rai.skumar
3
你正在使用Unix系统吗?否则,那个脚本并没有什么帮助。 - melpomene
7个回答

160

什么是扩展名为.sh的文件?

它是一个Bourne shell脚本。它们在许多变体的类UNIX操作系统中使用。它们没有“语言”,并由您的shell(终端命令解释器)解释,或者如果第一行以以下形式:

#!/path/to/interpreter

他们将使用特定的解释器。您的文件第一行为:
#!/bin/bash

这意味着它使用了Bourne Again Shell,也称为bash。实际上,它是好旧的sh的替代品。

根据解释器的不同,文件可能用不同的语言编写。

请记住,在UNIX世界中,文件的扩展名并不能决定文件的类型(参见下面的“如何执行shell脚本”)。

如果你来自DOS / Windows世界,你会熟悉具有.bat或.cmd扩展名(批处理文件)的文件。它们在内容上不相似,但在设计上类似。

如何执行shell脚本

与一些不安全的操作系统不同,*nix不仅依赖于扩展名来确定如何处理文件,还使用权限。这意味着,如果您尝试下载后运行shell脚本,那么它就像尝试“运行”任何文本文件一样。 ".sh"扩展名只是为了方便识别该文件。

您需要使文件可执行。假设您已将文件下载为file.sh,则可以在终端中运行:

chmod +x file.sh

chmod 是一个用于更改文件权限的命令,+x 设置执行权限(在这种情况下是所有人)然后再加上文件名。

你也可以在图形用户界面(GUI)中完成此操作。大多数情况下,你可以右键单击文件并选择属性;在 XUbuntu 中,权限选项看起来像这样:

File permissions in XUbuntu

如果您不想更改权限,也可以强制 shell 运行命令。在终端中,您可以运行以下命令:

bash file.sh

脚本中的第一行应该与shell相同。

它有多安全?

您可能觉得奇怪,您必须手动执行另一个任务才能执行文件。但这部分是出于强烈的安全需求。

基本上,当您下载并运行bash脚本时,这与有人告诉您“按顺序在计算机上运行所有这些命令,我保证结果良好且安全”是一样的。问问自己是否相信提供此文件的当事方,问问自己是否确定已从与您认为的相同的位置下载了文件,甚至可以瞥一眼内部是否有异常(尽管这需要您了解*nix命令和bash编程)。

不幸的是,除了上面的警告之外,我不能逐步描述您应该做什么来防止计算机发生恶意事件;所以请记住,任何时候您获取并运行来自某人的可执行文件时,实际上都在说,“当然,您可以使用我的计算机来做某事”。


1
你实际上是在说,“当然,你可以使用我的电脑做一些事情”...这让我感到头痛...谁会从谷歌搜索中运行任何东西。 - starriet
顺便提一下,在Ubuntu中,即使一个文件以 #!/bin/bash 开头,我们也可以通过 dashsh 运行它。这是怎么可能的呢? - starriet

60
如果您在浏览器中打开第二个链接,您将看到源代码:
#!/bin/bash
# Script to download individual .nc files from the ORNL
# Daymet server at: http://daymet.ornl.gov

[...]

# For ranges use {start..end}
# for individul vaules, use: 1 2 3 4 
for year in {2002..2003}
do
   for tile in {1159..1160}
        do wget --limit-rate=3m http://daymet.ornl.gov/thredds/fileServer/allcf/${year}/${tile}_${year}/vp.nc -O ${tile}_${year}_vp.nc
        # An example using curl instead of wget
    #do curl --limit-rate 3M -o ${tile}_${year}_vp.nc http://daymet.ornl.gov/thredds/fileServer/allcf/${year}/${tile}_${year}/vp.nc
     done
done

所以这是一个bash脚本。你有Linux吗?


无论如何,脚本只是一系列的HTTP检索。大多数操作系统都提供了wget和curl,几乎所有语言都有HTTP库,因此在任何其他技术中进行重写相当容易。还有一些bash自身的Windows端口(git包括其中一个)。最后但并非最不重要的是,Windows 10现在具有对Linux二进制文件的本地支持


4
我没有 Linux,我在使用 Windows 7。这个东西只能供 Linux 用户使用吗? - Tony H
9
除了 Windows 外,它支持大多数操作系统(Linux、Unix、MacOS...)。 - Álvaro González
2
我在Windows上对Bash脚本进行了一些搜索,看起来这个主题已经被涵盖了一些:https://dev59.com/mmw15IYBdhLWcg3wxuch我会尝试一些东西来看看它是如何工作的。 - Tony H
5
拥有Linux?最佳答案!:) - Adam Erickson

46

sh 文件是 Unix(Linux) 的 shell 可执行文件,它们相当于 Windows 上的 bat 文件,但比后者更为强大。

因此,在 Linux 控制台中,您只需像在 Windows 中运行 bat 文件那样,输入该文件名即可运行。


2
根据特定的操作系统,您可能需要运行 chmod +x file.sh - Pranav A.
1
我会说bash更像是Windows的VBS,而不是批处理语言,因为批处理是DOS语言。 - user1853517

5

通常,.sh文件是一种在终端中可以执行的shell脚本。具体来说,你提到的脚本是一个bash脚本,如果你打开文件并查看文件的第一行,也称为shebang或magic line,你就可以看到。


1

我知道这是一个老问题,我可能没有帮助,但许多Linux发行版(例如Ubuntu)都有“Live CD / USB”功能,因此,如果您确实需要运行此脚本,可以尝试将计算机引导到Linux。只需将.iso刻录到闪存驱动器中(如何操作请参见http://goo.gl/U1wLYA),插入驱动器后启动计算机,按F键进入引导菜单。如果选择“...USB...”,则会启动您刚刚放置在驱动器上的操作系统。


然而,该文件只能在实际版本上运行。用户需要将文件复制回主操作系统(Windows)。 - Pranav A.

-1

-2

打开终端并输入以下命令: 1. chmod +x filename.sh 2. ./filename.sh 就这样


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接