在没有的当前shell中运行脚本。在命令之前


26

如果要在当前shell中执行脚本,可以通过在命令之前添加一个点来实现:

   . ./somescript.sh

有没有一种方法,而无需每次都键入点?例如,从脚本本身更改为父外壳的命令?

Answers:


22

它可能不完全是您想要的,但您可以这样做:

alias somescript.sh='. ./somescript.sh'

2
这完美地解决了我的问题。谢谢!
2013年

8

有没有一种方法,而无需每次都键入点?例如,从脚本本身更改为父外壳的命令?

我认为没有(除了键入source somescript.sh,但这可能不是您要查找的^^)。

如果您像往常一样使用来运行脚本./somescript.sh,那么外壳将分叉并执行此命令。它将命令传递给内核,然后内核通过解析#!脚本中的行来决定如何执行此命令。然后,内核启动指定的解释器(在这种情况下,可能是bash子外壳程序)。因此somescript.sh,对其环境所做的修改被隔离在子外壳中而不会影响父外壳。

如果希望外壳程序在不启动其他进程的情况下读取脚本本身,则必须使用.or source关键字明确地告诉它。


感谢您的详细解释。:)现在,我发现无法从被调用的脚本中执行此操作,但是很幸运,可以告诉父外壳不要使用该alias命令创建子外壳,如scott建议的那样。
2013年

1

如果您./somescript.sh作为外部程序执行,则它在运行中的Shell进程内无法执行任何操作,例如访问未导出的变量,设置变量,更改当前目录等。无法解决此问题。

(好吧,您可以从子进程中运行调试器并调整父进程的内存。但是,如果尝试这样做,最有可能的结果是崩溃了父shell。)

您需要运行. ./somescript.sh。您可以根据需要将其隐藏在别名或函数的后面,但是再次必须在父外壳中完成别名或函数的定义。


0

我认为您尝试运行的脚本不可执行。chmod a+x somescript.sh会将用户,组和其他(ugo)的执行位添加到该文件。文件的第一行也将需要#!顶部的线,例如#!/bin/bash

ls -l somescript.sh会显示该文件的rwx三元组(读/写/执行)。假设您拥有文件,则至少在第一组中需要x。


脚本本身可以正常工作,但是我想在当前的shell中执行它,以便能够修改shell的环境变量。
2013年

如果导出脚本中所需的变量无效,例如export PATH=$PATH:/usr/local/bin将/ usr / local / bin添加到$ PATH,则确实需要提供文件源来更改运行环境变量。这个问题确实是“如何从bash脚本中以编程方式更改运行的shell中的环境变量?” 脚本. ./somescript.sh执行得很好-您正在使用dot命令来生成文件。tcsh对同一件事使用“源”。
AR Diederich

修改变量只是一个例子。我的问题是,是否有可能在不实际编写外壳的情况下告诉外壳应该有一个圆点(例如从脚本本身)
2014年

点可能很容易被遗忘,这可以完全改变脚本的行为。
2013年

0
export PATH=$PATH:.

在外壳中运行该命令或将其添加到外壳配置文件中,会将当前目录附加到PATH变量中。PATH变量是目录的列表,您的外壳将在这些目录中查找发出命令时要执行的二进制文件。

这将使您无需运行当前目录中的任何可执行文件 ./


1
OP询问的.不是./文件名中的第一个。运行./somescript不会像在当前shell中那样执行它. ./somescript
Anthon
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.