用于创建和使用名称为

时间:2016-04-03 02:34:40

标签: linux bash unix mkdir cd

我正在开发一个项目,在我的GitLab CE实例中远程创建一个存储库(该部分正在工作!),然后使用项目名称创建一个目录(工作!)并cd进入该目录(这里是我遇到问题的地方......)然后在本地初始化并添加远程存储库(工作!!!)

我遇到的问题只是转换到新目录。无论我使用下面显示的代码,还是只是尝试cd "$1"cd "$*",我似乎都无法使用它!

#!/bin/bash

dir="$*"
wd=$(pwd)
fulldir="$(pwd)/${dir// /\\ }/"
echo "Creating directory $dir"
mkdir -v "$dir"
cd "$dir"
echo "Changing current directory to $dir"
echo $dir
echo $fulldir

此代码的输出为:

root@cana:~# ls
glnewproj  test
root@cana:~# bash test Hello World
Creating directory Hello World
mkdir: created directory 'Hello World'
Changing current directory to Hello World
Hello World
/root/Hello\ World/
root@cana:~# ls
Hello World  glnewproj  test
root@cana:~# pwd
/root

我如何cd进入我新创建的目录?我完全难过了。

编辑:

键入每个ghoti的函数并在.bashrc内和我的测试脚本中进行测试。

直接从bash运行函数时:

root@cana:~# ls
glnewproj  test  test2
root@cana:~# mkcd "Hello World"
root@cana:~/Hello World# 

在新测试脚本中运行该函数时:

root@cana:~# ls
glnewproj  test  test2
root@cana:~# cat test2
#!/bin/bash

mkcd() {
  mkdir -p "$1" && cd "$1"
}

mkcd "$1"

root@cana:~# bash test2 "Hello World"
root@cana:~# ls
Hello World  glnewproj  test  test2

因此脚本仍然作为子进程运行,因此不会更新父shell的当前目录。我是唯一一个在脚本末尾生成新shell的选项吗?

3 个答案:

答案 0 :(得分:3)

当您从脚本中的 cd时,您的目录在脚本中更改,但不在调用shell中更改。交互式shell中的工作目录由THAT shell中的cd命令设置,而不是由它运行的程序内部设置。

如果您希望脚本能够更改交互式shell的目录,那么您可能需要设置bash 功能。例如,以下内容可以添加到您的.bash_profile

mkcd() {
  mkdir -p "$1" && cd "$1"
}

由于此函数在交互式shell的上下文中运行,而不是生成子shell或子进程,因此在退出后它将保留的目录更改。

另一个选择,如果你需要/想要使你的目录创建脚本成为一个独立的工具,就是在mktemp之后对事物进行建模,创建它需要的东西,然后将它创建的内容的名称返回给stdout 。因此,使用以下脚本,可能称为mkcd

#!/bin/bash

if mkdir -p "$*"; then
  cd -P "$*"
  pwd
  r=0
else
  r=$?
fi

exit $r

然后在你的调用脚本中,你可以运行它:

#!/bin/bash

d=$(mkcd Hello World)

if [ ! -d "$d" ]; then
  echo "ERROR: I can't go on like this" >&2
  exit 1
fi

cd "$d"
: do your stuff

请注意,错误检查仍然是一个好主意,即使它似乎是多余的,因为如果使用特殊字符或奇怪的格式来构建目录名,可能会成为意外或故意不可预测行为的受害者。

答案 1 :(得分:2)

通过更多研究,我发现这是因为脚本是子进程,不能影响父shell。也就是说,脚本将cd用于自己的目的。例如,我可以将代码更改为以下内容:

#!/bin/bash

dir=$1
mkdir -v "$dir"
cd "$dir"
touch test.file

然后运行

$ bash test "Hello World"

结果将是test.file中出现的文件./Hello\ World/,但是当脚本完成后,我仍然会在上一个工作目录中。

获得我想要的结果(即cd到新目录)的一种草率方法是使用exec bash在脚本中生成一个新会话。

答案 2 :(得分:-1)

只要您使用问题中提到的cd "$1",您的脚本(大部分)就可以了。问题是您需要确保将完整目录名实际作为单个参数传递。

$ bash test "Hello World"

然后在你的脚本中

# Omitting unused $wd
# Omitting $fulldir, which appeared to be for debugging purposes only
dir=$1
mkdir -v "$dir"
cd "$dir"