2012-03-12 111 views
2

我试图修改现有的shell脚本来接受用户输入并处理一些系统导出。下面是一个更大脚本的摘录。运行这个脚本后,我回显$ TEST_DIR,并且我没有收到任何回应。有任何想法吗?Bash Unix Shell脚本接受输入并设置系统变量

#!/bin/sh 

if [ -z "$TEST_DIR" ] 
then 
    echo "TEST_DIR was not set, please enter the path: " 
    read input_variable 
    export TEST_DIR=$input_variable 
    exit 1 
fi 
+0

尝试'源'文件名'。 – Gandaro 2012-03-12 18:22:44

+0

你正在退出,所以看起来你是在一个子shell中调用它,并且必须是变量不可见的原因。你怎么调用它?在现有的shell中调用它,即通过加前缀。即代替使用myScript的使用。 myScript的。 – 2012-03-12 18:23:07

回答

2

另存为script.sh

#!/bin/bash 

if [ -z "$TEST_DIR" ] 
then 
    echo "TEST_DIR was not set, please enter the path: " 
    read input_variable 
    export TEST_DIR=$input_variable 
fi 

,并运行它像这样:

. ./script.sh 

,或等效:

source ./script.sh 

source运行在当前环境中的脚本,从而使您可以修改环境脚本。没有它,每个命令(作为shell进程的子进程运行)都只被赋予当前环境的副本。

注意我删除了exit行,因为它会在这种情况下终止shell。

1

问题是你在一个子shell中运行脚本 - 它正确设置你的TEST_DIR,但然后shell退出,并且父shell不保留更改。

你可能会更好地使这个函数可以从父shell获得。 Shell脚本不能修改调用shell的环境,但函数可以修改它正在执行的shell。

1

你可能不想做exit 1;用于表示失败。您将使用exit 0来指示成功—,但是,如下所述,在这种情况下,您也不想这样做。

另一个问题是,如果将脚本作为子进程运行,它不会影响父进程的环境。

要解决的是,在POSIX贝壳,你需要使用:

. your_script.sh 

,或者在bash,你也可以使用:

source your_script.sh 

脚本不必是可执行的,只是可读,并将在$PATH上进行搜索,除非您指定一个包含斜杠的名称,就像其他命令一样。

而且,当您执行.source时,您肯定不希望脚本中有任何exit,因为这会导致主shell退出。 shell读取文件就好像你在标准输入中输入(或多或少),所以执行的exit将退出shell。