Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在用户';通过带有命令mkdir~/adirectory的shell脚本创建主目录_Shell - Fatal编程技术网

在用户';通过带有命令mkdir~/adirectory的shell脚本创建主目录

在用户';通过带有命令mkdir~/adirectory的shell脚本创建主目录,shell,Shell,我正在尝试使用shell脚本在用户的主目录中创建目录。脚本有以下行: mkdir -p $path # where path=~/adirectory, path is obtained from env 但它不是在用户的主目录(即/home/auser/adirectory)中创建它,而是在当前工作目录中创建一个名为~的目录,并将adirectory放在其中 更新: 感谢乔纳森·莱夫勒的帮助。下面是我的代码的工作片段: function init() { if [ "$PROJECT_

我正在尝试使用shell脚本在用户的主目录中创建目录。脚本有以下行:

mkdir -p $path # where path=~/adirectory, path is obtained from env 
但它不是在用户的主目录(即
/home/auser/adirectory
)中创建它,而是在当前工作目录中创建一个名为
~
的目录,并将
adirectory
放在其中

更新:

感谢乔纳森·莱夫勒的帮助。下面是我的代码的工作片段:

function init() {
  if [ "$PROJECT_DIR" = "" ]; then
    export PROJECT_DIR=$HOME/projects
  fi

  mkdir -p `expand $PROJECT_DIR`
}

function expand(){
  echo `sh -c "echo $1"`
}

正如Jonathan Leffler指出的,问题在于
瓷砖扩展
。使用
sh-c$path对我很有效。

问题在于tilde扩展。使用sh-c$path对我很有效

function init() {
  if [ "$PROJECT_DIR" = "" ]; then
    export PROJECT_DIR=$HOME/projects
  fi

  mkdir -p `expand $PROJECT_DIR`
}

function expand(){
  echo `sh -c "echo $1"`
}

哪个外壳,哪个系统?你说
$path=~/adirectory
;你有没有看它有什么价值?分配应该是
path=~/a目录
。在执行
mkdir
命令之前,您会从
echo“$path”
中得到什么?你还需要仔细检查,看看这是否能解释为什么你会得到你想要的结果(可能是这样)。请注意,外壳将展开(或不展开)
~
mkdir
只是将其视为路径名的第一个字符,它是相对于当前目录的路径,因为它不是以
/
开头的。我甚至尝试了mkdir-p$(echo$path),但它不起作用。请注意,
/bin/sh
通常是伪装的
bash
,但它可以是破折号或另一个外壳。使用Bash作为
/bin/sh
更改其操作模式。波浪式展开发生在变量展开之前,因此如果变量值包含
~
,则它保持为
~
;这与最初的问题报告是一致的。但是,不清楚如何让echo$path给出完整的路径名,这与所声称的行为完全不一致。我们可以看到运行的结果吗:
sh-x-c'path=“~/adirectory.v2”;回显“$path”;mkdir-p$path'
?选择的名称不同;它将创建
~
目录,然后我们需要查看以下结果:
sh-x-c'path=~/adirectory.v3;回显“$path”;mkdir-p$path'
也是。这将扩展分配中的
~
,因此
echo
应给出完整的路径名,并且应按预期创建目录(模块权限问题和/或预先存在)。如前所述,您的问题报告了该版本的行为,并在作业周围加了引号;然后,它声明该版本的行为,但在赋值周围不加引号。我想你可能对某些事情感到困惑,或者我对你正在做的事情感到非常困惑。正确的做法是根本不要在
路径的值中使用
~