【问题标题】:How to execute script in the current shell on Linux?如何在 Linux 上的当前 shell 中执行脚本?
【发布时间】:2013-02-07 06:21:05
【问题描述】:

有没有办法从 whitin It 标记要在当前 shell 中执行的脚本? 我知道我可以使用:

. ./path/myscript.sh

但我需要一种在脚本中包含“点”方式的方法。

编辑: 情况就是这样。我在目录 A 中有一个脚本“myscript.sh”:

rm -r A
mkdir A
touch A/test.file
cd A

当脚本以正常方式执行时:

sh myscript.sh

退出脚本时,我无法列出目录。 在当前 shell 中启动脚本时:

. ./myscript.sh

没有问题。我需要一种方法来在我的脚本中包含这个“点”方式,这样就可以在没有它的情况下调用它。

【问题讨论】:

  • “点”是“源”命令的简写。如果我理解正确,这是无法做到的。脚本本身无法决定是调用还是获取源,调用 shell 必须决定。
  • 了解 bash function-s,例如阅读tldp.org/LDP/abs/html

标签: linux shell


【解决方案1】:

有两种方法可以在 shell 中执行脚本。根据您的需要,您必须执行以下操作之一(不要同时执行!)。

  1. 将脚本作为程序启动,它有自己的进程。
  2. 将脚本作为一堆文本获取,其中文本由当前 shell 处理。

要将脚本作为程序启动:

  • #!/bin/bash 行添加为脚本的第一行

这将被加载器读取,它具有特殊的逻辑,将前两个字符#! 解释为“启动下一个程序,并将内容传递给它”。请注意,这仅适用于为接收内容而编写的程序

要将脚本源代码到当前 shell:

  • 键入命令. script.shsource script.sh

注意:bash 中的. 等同于bash 中的source

这就像您输入“script.sh”的内容一样。例如,如果您在“script.sh”中设置了一个变量,那么该变量将在当前 shell 中设置。您需要取消定义该变量以将其从当前 shell 中清除。

这与#!/bin/bash 示例有很大不同,因为在新的bash 子进程中设置变量不会影响您从中启动子进程的shell。

【讨论】:

  • 这个答案提供了一个很好的解释,一个解决方法是根据我下面的答案来获取函数定义。
  • 很好的解释,但没有回答问题。 OP 如何在调用脚本时避免使用“点”?答案是函数,正如其他一些答案中所解释的那样。
  • @Bzazz 我认为您没有仔细阅读帖子,答案是“来源”,它就在那里。你不能只调用一个函数而不定义它,你的定义将在一个文件中,并且要将那个文件读入当前的 shell,你将不得不 source 它。将它放在不同的 shell 中,您可以使用 shebang 将其读入子进程 shell,但不能读入当前 shell。
  • OP 已经知道点运算符。这与来源相同。他们正在询问如何将其包含在“脚本中”。这样调用脚本时就不需要使用点了。
  • @Bzazz 我在原始问题中没有看到任何迹象表明 OP 知道源与点相同。当然,他们知道 dot,但在他们的情况下,他们希望将外部文件中的函数、变量和代码导入到他们当前的 shell / bash 脚本中。通常包含其他文件可以通过两种方式完成,在子 shell 中和在同一个 shell 中。 Subshel​​l 可以用普通的 exec / bash / etc 处理。但同样的 shell 需要“。”或“来源”,实际上没有其他方法。所以,我提供了“来源”并解释了它是一样的,以及为什么。
【解决方案2】:

如果你创建一个 shell 函数而不是一个脚本,你就可以做到这一点。函数在同一个 shell 中执行,而不是在子 shell 中。如果您在 .profile 中定义函数,它们将可用于 login-shell。

我在这里找到了更多细节和解释:http://steve-parker.org/sh/functions.shtml

【讨论】:

    【解决方案3】:

    您可以做的一件事是将该函数添加到您的 .bash 配置文件中。那么运行函数就不会运行脚本了。

    我现在试试……

    testit() {
      rm -r A
      mkdir A
      touch A/test.file
      cd A
    }
    

    工作...

    所以另一种选择是创建一个包含函数定义的文件,并获取该文件。

    【讨论】:

    • 我之前定义了一个这样的函数,但读到 .bash_profile 不应该太混乱,所以我将我的函数移动到一个脚本并遇到了与 OP 相同的问题。我目前的解决方案是现在使用“Edwin buck”的. script_name 解决方案,但将其设置为我的.bash_profile 中正常脚本名称的别名,就像另一个解决方案选项一样
    【解决方案4】:

    试试这个:

    source path/to/shell/script.sh
    

    它将在当前shell中执行shell脚本。

    【讨论】:

      【解决方案5】:
      1. #!/bin/sh作为脚本的第一行
      2. 添加执行权限,即chmod +x /path/to/script.sh

      然后就可以运行脚本了

      /path/to/script.sh

      或者如果你在PATH 环境变量中有/path/to,你可以简单地执行script.sh

      【讨论】:

      • 这完全相反:据我了解,它在一个新的 shell 进程中执行
      【解决方案6】:

      最短的方法是在shell中输入单词:

      :%w !sh
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2011-04-13
      • 2018-08-30
      • 2013-09-19
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多