【问题标题】:Define a variable in the .environment file and use (refrence) that in the .sh file在 .environment 文件中定义一个变量并在 .sh 文件中使用(引用)该变量
【发布时间】:2021-04-25 02:21:37
【问题描述】:

如果文件夹不存在,我已经编写了一个 bash 脚本来创建一个文件夹,并在我的环境文件中设置了变量并在我的 .sh 文件中引用了它

下面是我的脚本,我在我的环境文件中添加的 .sh 文件中添加了变量。

#!/bin/bash

if [ ! -d "$checkfolder" ]; then
  mkdir -p "$createfolder";
fi

我在 /etc/environment 文件中设置了以下环境变量

checkfolder=/home/ubuntu/hello23
createfolder=/home/ubuntu/hello23

当我执行脚本时出现以下错误:

ubuntu@:~/cicd$ ./createfolder.sh 
mkdir: cannot create directory ‘’: No such file or directory

这是我编写的普通脚本,如果它不存在,它会工作并创建一个文件夹

if [ ! -d /home/ubuntu/hello ]; then
  mkdir -p /home/ubuntu/hello;
fi

这里有什么问题,我应该做些什么改变?

【问题讨论】:

  • 您的变量为空。不确定您要达到的目标,但简单的 mkdir -p 就足够了(无需测试)。但是在测试时你至少应该使用相同的变量
  • @BilalYousaf :您必须创建一个新的登录 shell (bash --login) 才能读取 /etc/environment。这被描述为here。或者,您可以将脚本中的第一行更改为 #!/bin/bash -l

标签: bash shell ubuntu mkdir


【解决方案1】:

/etc/environment~/.pam_environment 在您登录时被读取。如果您刚刚编辑了这些文件,您的更改将不会应用到当前会话。

如果要将更改应用到当前会话,可以运行

. /etc/environment

在当前 shell 中设置变量。这仅在变量的值不包含任何 shell 特定字符(空格、()[]{}\|&;<>~*?'"`$# 并且我可能忘记了一些)时才有效,因为/etc/environment 的语法只是 shell 语法的近似值。

如果您添加了新变量,而不仅仅是更改了它们的值,您还需要导出它们(shell 中的VAR=value 只会创建一个 shell 变量,而不是环境变量)。

export MY_HOME checkfolder createfolder

或更一般地

export $(sed -n 's/^\([A-Za-z0-9_]*\)=.*/\1/p')

没有为每个新程序设置环境的文件,因为这会破坏环境的要点,即每个进程都有自己的,它从其父进程继承。如果有一个“全局环境文件”,就不可能在不同的环境下运行程序。如果要全局配置,请阅读配置文件:

if [ -e ~/.my_application_configuration.sh ]; then
  . ~/.my_application_configuration.sh
fi

有一种方法可以让文件为每个 bash 脚本设置环境(仅限 bash 脚本,而不是 sh 脚本):将文件的完整路径放入环境变量 BASH_ENV .正如我刚才解释的那样,这通常是个坏主意。

【讨论】:

  • 我。有。将这些更改应用于我当前的会话。像你一样。建议。但是,我仍然收到相同的错误:mkdir:无法创建目录'':没有这样的文件或目录。
  • @BilalYousaf 抱歉,如果您添加了新变量,我会忘记一个步骤。查看我的编辑。
  • 谢谢。对我有用,感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2020-03-13
  • 2019-02-16
  • 2011-01-14
  • 2018-08-04
  • 2015-08-04
  • 2021-08-26
相关资源
最近更新 更多