执行二进制文件和脚本的不同方法


11

我已经使用Linux一段时间了,我一直在寻找有关它的完整概述,但没有找到任何内容。

我只是不习惯执行脚本和二进制文件的所有不同方式-对我来说这真是一团糟,我必须反复试验才能确定应该使用什么。对于脚本或二进制文件<script/binary>,我可以提出以下选择:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(还有更多吗?)

有人可以全面概述哪些命令适用于哪些类型的文件,并且在存在多个选项时有何不同?

谢谢。

Answers:


7

以下命令相同,点组件表示“当前目录”。为了允许执行,文件需要具有可执行权限:

path/to/binary
./path/to/binary

请注意,如果路径不包含斜杠,则将其视为命令(内置的shell或在$PATH环境变量中查找的程序)。

以下内容几乎相同,它们在当前的shell环境中执行一个shell脚本(不是二进制!)。在Unix.SE问题上描述了两行之间的细微差别。

. path/to/script
source path/to/script

最后你提到了sh script。同样,这仅适用于shell脚本,不适用于二进制文件。您基本上是sh在以脚本名称作为参数来执行程序。在的情况下sh,它将仅将此参数视为shell脚本并执行它。

有关仅限于Shell脚本的答案,请参阅执行Shell脚本的不同方法


3

感谢所有的投入。我现在将尝试回答我自己的问题,并提供有关执行脚本和二进制文件的各种可能性的完整指南。请编辑和评论,我们将提出完整且正确的内容。这是我的建议:

首先,有两点要说明:

  • Linux区分命令路径。一个命令只类型为-上的提示,并且将执行一个内置的或将导致Linux的找相应的二进制或在$ PATH的脚本。

  • 为了使Linux将某事物解释为路径,它需要至少包含一个斜杠(/)。例如./myScript./中的似乎很多余-仅仅是为了使Linux将其解释为路径而不是命令。

因此,用于执行二进制文件或脚本的选项:

执行二进制文件binary

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

执行脚本script

除非另有说明,否则该文件将必须具有执行权限。

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

关于她刘海

#!/bin/sh第一行带有she-bang的脚本(例如)告诉要使用的解释器。

  • 当被执行时该解释将被用于通过./script或者使用命令:scriptscript必须在PATH)
  • sh script在这种情况下,using 将忽略she-bang并使用sh解释器
  • 使用. scriptsource将忽略she-bang并使用当前的解释器(因为.source等效于仅在当前shell中执行脚本的每一行)

脚注

* 1:这几乎是正确的。在bash中,它们的确是相同的命令,但使用时sourcescript将在$ dir 之前的当前目录中进行搜索。这是猛烈的打击,但是在仅POSIX的外壳中,source它不起作用,但是.可以。因此,最好将后者用于可移植性。

* 2:实际发生的是我们以'script'作为参数运行二进制sh,这将使'sh'在新的shell中执行'script'


2

这是命令的快速清单。注意,当我提到PATH时,是指包含系统知道的程序的目录。您找到具有的那些echo $PATH,结果将类似于:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

剧本

  • 要在当前工作目录中执行脚本,请使用 ./myscript.sh
  • 要在另一个文件上执行脚本,请使用(如果它在当前工作目录中), ./myscript.sh textfile.txt
  • 脚本也可以带有参数来运行。如Rutep。68)中所述:myfile.sh dogs cats birds将输出,The first argument is: dogs, second argument is: cats, third argument is: birds因为该脚本在shebang之后的内容为:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • 要在另一个目录中执行脚本,请使用 ~/Scripts/dogs.sh

  • 要执行系统知道的脚本,因为它位于主目录的bin文件夹中(如果不存在,请创建它,因为它将自动添加到PATH中),只需使用 scriptname
  • 要执行已安装的脚本,请再次使用其名称,因为系统会知道该名称:例如, get_iplayer

二进制文件

  • 要运行系统知道的二进制文件(因为它位于$ PATH中),请使用程序的名称和任何参数,例如, vlc <stream url to open>
  • 要测试在安装到/ usr / local / bin之前已编译的二进制文件,或使独立程序远离系统,请使用 ~/<folder>/app/myprog

感谢您提供信息。这句话正确吗:要执行不在PATH中的脚本或二进制文件,只需指定其路径即可。当前路径中的脚本需要./的原因是,仅'script.sh'将被解释为命令,因为它缺少至少一个斜杠/。
卡尔

“要执行已安装的脚本”,我“已安装”的脚本是什么?这一点说的与前一点相同吗?
卡尔

@ Carl-您的第一个评论是正确的,但是要说我关于脚本的最后两点是不正确的。在脚本部分的第5点中,我讨论的是用户已手动将脚本添加到其主目录中的bin文件夹中;在第6点中,我谈论的是诸如get_iplayer之类的脚本,它们是从存储库中安装的,因此总是进入系统文件夹,而不是进入用户的主目录。

抱歉,我仍然不明白,〜/ bin /(位于PATH中)或系统文件夹(位于PATH中)中的脚本-它们之间有什么区别?他们的行为不同吗?
卡尔

我只是在区分用户在〜/ bin中拥有并添加到的脚本与系统文件夹中root所拥有的脚本之间的区别。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.