2010-07-18 92 views
98

我是bash shell脚本编程新手,遇到了挑战。我知道我可以只是在做我重装“的.profile”文件:在bash shell脚本(在unix中)重新加载.profile?

. .profile 

,但我想在bash脚本我写,执行相同的,它只是不工作。 任何想法?还有什么我可以提供澄清?

谢谢

+0

正如Ignacio指出的那样,您的脚本正在一个子shell中运行。子shell不能修改主外壳(子进程不能修改其父进程)。所以你需要通过使用“。”来“源”脚本。命令(也可以拼写为“源”)。所以如果你的脚本想修改环境变量,你需要做一些类似“source myscript”或“。myscript”的东西(它们都是同样的东西)。这会修改你的主shell的环境。 (我认为是你想要做的,让我知道如果这是错误的。) – bstpierre 2010-07-20 03:08:17

+1

我从你的问题得到了我的答案:) – 2016-10-18 17:04:20

回答

149

试试这个重新加载当前的shell:

source ~/.profile 
3

bash脚本运行在一个单独的子shell中。为了完成这项工作,您还需要获取其他脚本。

+0

我不知道(对所有这些仍然是新的)你到底意味着什么由“源” - 另一个脚本。可以请扩展一点。我试过了: $。 〜/ .profile $。/etc/profile 没有成功。非常感谢。 – 2010-07-18 05:07:27

+1

@amirrustan:你的脚本将需要从你的'.profile'文件中找到这样的内容:'。 $ HOME/.profile',你需要通过采购它来启动你的脚本。像''。/path/to/yourscript' – 2010-07-18 08:35:48

+1

@amirrustam请阅读http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-脚本/ 176788#176788 – lesmana 2010-08-23 03:44:20

0

尝试:

#!/bin/bash 
# .... some previous code ... 
# help set exec | less 
set -- 1 2 3 4 5 # fake command line arguments 
exec bash --login -c ' 
echo $0 
echo [email protected] 
echo my script continues here 
' arg0 "[email protected]" 
6

试试这个:

cd 
source .bash_profile 
1

试图重新加载/源当一对夫妇的问题出现时〜 /.profile文件。 [这是指Ubuntu Linux操作系统 - 在某些情况下,命令的细节会有所不同]

  1. 你直接在终端或脚本运行呢?
  2. 你如何在脚本中执行此操作?

Ad。 1)

直接在终端中运行意味着将不会创建子shell。所以,你可以使用两个命令:

source ~/.bash_profile 

. ~/.bash_profile 

在这两种情况下,这将更新.profile文件的内容的环境。

广告2)您可以通过调用

sh myscript.sh 

. myscript.sh 

在第一种情况下,这将创建一个子shell,不会影响环境变量启动任何bash脚本你系统,它们将只对subhell进程可见。在完成subshel​​l命令后,将不会应用任何导出等。 这是一个共同的错误,并导致很多开发者失去很多时间。

为了在脚本中应用更改,以对全球环境的脚本必须与

.myscript.sh 

命令运行效果。

为了确保脚本没有在subshel​​中运行,您可以使用此函数。 (再例如Ubuntu shell)

#/bin/bash 

preventSubshell(){ 
    if [[ $_ != $0 ]] 
    then 
    echo "Script is being sourced" 
    else 
    echo "Script is a subshell - please run the script by invoking . script.sh command"; 
    exit 1; 
    fi 
} 

我希望这可以解决一些常见的误解! :D 祝你好运!