Bash Unix Shell脚本接受输入并设置系统变量
问题描述:
我试图修改现有的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
答
另存为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。
答
问题是你在一个子shell中运行脚本 - 它正确设置你的TEST_DIR
,但然后shell退出,并且父shell不保留更改。
你可能会更好地使这个函数可以从父shell获得。 Shell脚本不能修改调用shell的环境,但函数可以修改它正在执行的shell。
答
你可能不想做exit 1
;用于表示失败。您将使用exit 0
来指示成功—,但是,如下所述,在这种情况下,您也不想这样做。
另一个问题是,如果将脚本作为子进程运行,它不会影响父进程的环境。
要解决的是,在POSIX贝壳,你需要使用:
. your_script.sh
,或者在bash
,你也可以使用:
source your_script.sh
脚本不必是可执行的,只是可读,并将在$PATH
上进行搜索,除非您指定一个包含斜杠的名称,就像其他命令一样。
而且,当您执行.
或source
时,您肯定不希望脚本中有任何exit
,因为这会导致主shell退出。 shell读取文件就好像你在标准输入中输入(或多或少),所以执行的exit
将退出shell。
尝试'源'文件名'。 – Gandaro 2012-03-12 18:22:44
你正在退出,所以看起来你是在一个子shell中调用它,并且必须是变量不可见的原因。你怎么调用它?在现有的shell中调用它,即通过加前缀。即代替使用myScript的使用。 myScript的。 – 2012-03-12 18:23:07