14

有没有办法从 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

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

4

6 回答 6

24

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

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

要将脚本作为程序启动:

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

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

要将脚本源到当前 shell:

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

注意:.in bash 等价于sourcein bash。

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

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

于 2017-10-23T21:27:30.680 回答
7

如果您创建 shell 函数而不是脚本,则可以执行此操作。函数在同一个 shell 中执行,而不是在子 shell 中。如果您在 .profile 中定义函数,它们将可用于 login-shell。

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

于 2013-02-07T06:38:45.257 回答
3

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

我现在就试试...

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

作品...

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

于 2019-07-05T11:52:28.753 回答
1

尝试这个:

source path/to/shell/script.sh

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

于 2017-10-23T21:15:14.863 回答
0
  1. 放在#!/bin/sh脚本的第一行
  2. 添加执行权限即chmod +x /path/to/script.sh

然后就可以运行脚本了

IE/path/to/script.sh

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

于 2013-02-07T06:24:38.093 回答
0

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

:%w !sh
于 2022-01-14T00:15:00.153 回答