如何在终端执行bash脚本?

180

我有一个像这样的bash脚本:

#!/bin/bash

echo Hello world!

如何在终端执行这段代码?


36
它是否具有执行权限?尝试运行 chmod +x 脚本名 然后运行 ./脚本名 - dirkgently
9个回答

182

另一种执行它的方法(这次不需要设置执行权限):

bash /path/to/scriptname

我遇到了一个单独的问题(在Mac上尝试通过终端安装Anaconda),这是解决方案。我需要做的唯一一件事就是关闭并重新启动shell,按照这里的一步操作(/(your conda installation path)/bin/conda init zsh),然后再次关闭和重新打开shell。 - S.Chauhan

68

输入$prompt: /path/to/script并按回车键。请注意,您需要确保脚本具有执行权限。


4
如果你已经在 /path/to 目录下,例如使用 cd /path/to 命令进入了该目录,那么你可以输入 ./script 来运行脚本。在这种情况下,不要忘记在 'script' 前面加上 './'。 - FrViPofm

43

进入包含脚本的目录,或者将脚本放到 $PATH 中的 bin 文件夹中。

然后输入:

./scriptname.sh

如果在同一个目录中或者

scriptname.sh
如果它在bin文件夹中。

12
只有当脚本的执行位被设置时,这才能起作用。这可能需要解决。 - Bryan Oakley
./scriptname.sh 对我有效,但 scriptname.sh 显示 scriptname.sh: command not found-rwxr-xr-x 是它的权限。 - Spikatrix
1
“cd” 到任何地方的建议会引发另一个常见的初学者误解。除非脚本内部有依赖关系需要在特定目录下运行(例如,需要读取数据文件,而脚本不提供指向该文件的选项),否则您永远不需要 “cd” 到任何地方来运行它,并且很多时候也不想这样做。 - tripleee

34

这是一个旧帖子,但我偶然看到它,惊讶于还没有人发表完整的答案。所以我就来解答一下...

执行命令行脚本教程!

问:我该如何在终端中执行这个脚本?

下面是答案,但首先...如果你正在问这个问题,这里有一些其他信息可以帮助你:

混淆和冲突:

路径

  • 理解路径(由tripleee添加以确保完整性)很重要。“路径”听起来像是一种禅意的黑客公案之类的东西,但它只是自动搜索未知命令时搜索的目录(文件夹)列表。一些命令,如ls可能是内置命令,但大多数命令实际上都是单独的小程序。(这就是Unix的禅意的用处...“(i)让每个程序都做一件事情,并且做好这件事情。”)

扩展名

  • 与许多人记忆中的旧DOS命令提示符不同,您不需要扩展名(例如.sh或.py或任何其他扩展名),但是使用它有助于跟踪。实际上,它只是供人类用作参考,大多数命令行和程序并不会在乎。它也不会损坏。但是,如果脚本名称包含扩展名,则必须使用它。它是文件名的一部分。

更改目录

  • 您无需以任何方式位于特定目录中。但是,如果该目录未在路径上(键入echo $PATH以查看),则必须包含它。如果要从当前目录运行脚本,请在其前面使用./。这个./意思是“当前目录中的这里”。

输入程序名称

  • 除非你想要,否则你不需要打出运行文件的程序名称(BASH或Python或任何其他)。这不会对它造成伤害,但是有些情况下,可能会得到稍微不同的结果。

SUDO

  • 不需要使用sudo来执行任何操作。此命令保留用于以另一个用户或“root”(管理员)用户身份运行命令。使用sudo运行脚本会导致更大的危险,容易搞砸事情。因此,如果您不知道使用sudo的确切原因,请不要使用它。在这里发布的内容非常好。

# A good place to put your scripts is in your ~/bin folder.

> cd ~/bin # or cd $HOME/bin

> ls -l

您将看到一个所有者和权限的列表。您会注意到,在此目录中,您“拥有”所有文件。您对此目录拥有完全控制权,没有其他人可以轻易修改它。

如果不存在,您可以创建一个:

> mkdir -p ~/bin && cd ~/bin
> pwd

/Users/Userxxxx/bin


A: 在Unix/Linux系统的终端上“执行此脚本”,您需要完成三件事:

1. 告诉系统脚本的位置。(选择其中一种方法)

# type the name of the script with the full path
> /path/to/script.sh

# execute the script from the directory it is in
> ./script.sh

# place the script in a directory that is on the PATH
> script.sh

# ... to see the list of directories in the path, use:
> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# ... or for a list that is easier to read:
> echo -e ${PATH//:/\\n}
# or
> printf "%b" "${PATH//:/\\n}"
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

2. 告诉系统脚本有执行权限。(选择一个)

# set the 'execute' permissions on the script
> chmod +x /path/to/script.sh

# using specific permissions instead
# FYI, this makes these scripts inaccessible by ANYONE but an administrator
> chmod 700 /path/to/script.sh

# set all files in your script directory to execute permissions
> chmod +x ~/bin/*

这里有一个很棒的权限讨论,还有一张酷炫的图表在这里

3. 告诉系统脚本的类型。 (选择一个)

  • 在脚本之前输入程序名称。(注意:使用此方法时,不需要执行(chmod)命令)
> bash /path/to/script.sh
... 

> php /path/to/script.php
... 

> python3 /path/to/script.py
...
  • 使用shebang,我在你的示例中看到了它(#!/bin/bash)。如果将其作为脚本的第一行,系统将使用该程序来执行脚本。无需输入程序或使用扩展名。
  • 使用“可移植”的shebang。您还可以通过使用#!/usr/bin/env后跟程序名称(例如#!/usr/bin/env bash#!/usr/bin/env python3)让系统选择在PATH中首次出现的程序版本来执行脚本。如此处所述,有利有弊。

注意:这个“可移植”shebang可能并不像它看起来那么可移植。就像任何超过50年并深植于无数永远不会按照您期望的选项的东西一样...... 会有激烈的争论。我看到的最近的一个实际上与大多数想法非常不同,是“可移植”的perl-bang:

#!/bin/sh
exec perl -x "$0" "$@"
#!perl

2
非常好的总结。也许在最后一个例子中提醒人们,script.shscript.php是这些脚本的字面文件名,如果您在文件名中加入扩展名,则需要在运行脚本时包含它(反之亦然;如果脚本没有扩展名,则不要添加)。这与DOS不同,例如,您可以从文件名中省略.bat.exe,并且文件需要具有一组小的扩展名才能被视为可执行文件。 - tripleee
1
另一个常见的初学者错误是误解 path/path./path~/path 之间的区别。我猜你可能不想在这里解释它,但或许可以链接到一个解释,比如...哦该死,我得发这个链接 - tripleee

30

您可以执行以下操作:
sh scriptname.sh


7
反对投票:如果它是一个正确的bash脚本,那么这是错误的。 - tripleee
1
点赞:如果你的bash脚本在同一个目录下,那么在Mac OS X上这是没问题的。 - Karl Taylor
31
“对我来说有效”与“这是正确答案”相差甚远。如果“sh”是指向“bash”的符号链接,或者该脚本不使用任何特定于Bash的结构,则可以工作。在前一种情况下,使用“bash”而不是“sh”是唯一正确、可移植的解决方案;在后一种情况下,这不是针对此特定问题的正确答案,因为OP要求特别针对Bash脚本的建议。误传错误答案是不负责任的;那些未能理解区别的用户经常在此发布,需要向他们说明为什么这个“对我有用”的答案对他们无效。 - tripleee
1
@kraftydevil 也是这个主题上几个热门的重复目标之一:https://dev59.com/g2025IYBdhLWcg3w6aUX - tripleee
5
@kot,我重申一遍:在某些情况下,这是可行的(就像你发现的那样),但对于标题中所问的一般情况,这不是正确的答案。至少,这个答案应该解释一下它适用的条件;但我的建议是直接删除这个答案。 - tripleee
显示剩余6条评论

19

首先,您需要使用以下命令将其设为可执行:chmod +x name_of_your_file_script

在您将其设置为可执行之后,您可以使用./same_name_of_your_file_script运行它。


15
cd命令可将当前目录更改为脚本所在的目录。请执行以下操作:

通过使用 cd 命令将目录更改为脚本所在位置的目录

然后输入

bash program-name.sh

7
不需要cd到任何地方;你可以在bash命令中指定任意复杂的路径名作为参数;实际上,任何需要文件名参数的程序都是这样工作的(否则将非常可怕且令人昏迷)。 - tripleee

5

1
这将在当前 shell 中执行脚本,需要调用它。当您仅运行脚本时,这不是大多数人所期望发生的事情。这可能会对您现有的环境产生副作用。 - Software Engineer

-2

如果您在脚本文件可用的目录或文件夹中,只需通过以下方式将文件权限更改为可执行模式:

chmod +x your_filename.sh

之后,您可以使用以下命令运行脚本。

$ sudo ./your_filename.sh

上面的“.”代表当前目录。 注意! 如果您不在bash脚本文件所在的目录中,则可以使用以下命令更改文件所在的目录:

cd Directory_name/write the complete path

否则,您的脚本无法运行。


希望大家都能做到这一点,因为我提到了与这个特定问题相关的所有概念。 - Hassan Shamshir
1
正如其他答案所解释的那样,如果您在不受信任的脚本上使用sudo并滥用了您不必要授予它的权限,则sudo错误的,甚至可能是极其错误的 - tripleee
“cd” 到某个地方的建议很难理解,但可能也是错误的。 - tripleee

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