【问题标题】:Bash "source" command returns the wrong concatenated stringBash“source”命令返回错误的连接字符串
【发布时间】:2012-10-02 19:41:45
【问题描述】:

我有一个这样的配置文件:

//filename : stat.conf
LAS_SERVER="127.0.0.1"
LAS_PORT=3306
LAS_USER=root
LAS_PWD=root
LAS_DB=test
CONN_STR_LAS_DB="-h$LAS_SERVER -P$LAS_PORT -u$LAS_USER -p$LAS_PWD $LAS_DB"

现在我像这样运行source 命令:

$ source ./stat.conf

$ echo $CONN_STR_LAS_DB
testot.0.1

你可以看到结果是错误的。出乎我们的意料。

相比之下,如果我像这样在 shell 中运行命令,我可以获得正确的结果:

$ LAS_SERVER="127.0.0.1"
$ LAS_PORT=3306
$ LAS_USER=root
$ LAS_PWD=root
$ LAS_DB=test
$ CONN_STR_LAS_DB="-h$LAS_SERVER -P$LAS_PORT -u$LAS_USER -p$LAS_PWD $LAS_DB"
$ echo $CONN_STR_LAS_DB
-h127.0.0.1 -P3306 -uroot -proot test

这是正确的结果。

所以,我的问题是:为什么我在使用“source ./stat.conf”时得到了错误的结果?

我在另一台电脑上测试了同样的操作,我可以得到正确的结果。有什么我错过了在我的电脑上配置的东西吗?

我的操作系统是 CentOS 5。

【问题讨论】:

    标签: linux bash shell centos redhat


    【解决方案1】:

    您的配置文件具有 windows 样式的行尾 (\r\n),而不是 unix 样式的 (只是 \n)。您可以使用 dos2unix 命令对其进行转换。然后,切换到不会创建带有奇怪行结尾的文件的文本编辑器。

    【讨论】:

    • 非常感谢!这就是解决方案!
    • @user1284984:如果这个解决方案对你有用,你应该点击这个答案左边的勾来接受它。
    【解决方案2】:

    我知道你的 shell 代码有什么问题。

    这是环境变量的结果,你在shell脚本中声明的$CONN_STR_LAS_DB可以只存在于这个脚本的运行时间内,当然你不能在这个脚本之外回显$CONN_STR_LAS_DB。

    解决这个问题的方法是“导出”你的变量,也就是

    export $CONN_STR_LAS_DB                
    

    在你的 shell 脚本中,这肯定是可以做到的! 祝你好运!

    【讨论】:

    • 对不起,不是这样。当您 run 脚本时,它不会影响其父级的环境变量,但 sourcing(如此处所做的)在当前环境中运行命令,因此它可以(这这就是.bashrc 和其他配置文件起作用的原因)。这里的问题是 windows 行结尾,请参阅 Gordon 的回答。
    • source(或. dot 命令)的全部意义在于读取文件并在当前shell中执行其内容,正是为了改变shell的环境(因为它不在子进程中运行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2015-12-30
    • 2016-05-19
    • 2021-03-15
    • 2019-06-22
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多