bash 脚本来创建和 cd 到名称中带有空格的目录

Tho*_*age 4 unix linux bash cd mkdir

我正在开发一个项目,以在我的 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
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是:

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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

输入每个 ghti 的函数.bashrc并在我的测试脚本内和内对其进行测试。

直接从 bash 运行该函数时:

root@cana:~# ls
glnewproj  test  test2
root@cana:~# mkcd "Hello World"
root@cana:~/Hello World# 
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

gho*_*oti 5

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

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

mkcd() {
  mkdir -p "$1" && cd "$1"
}
Run Code Online (Sandbox Code Playgroud)

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


另一种选择,如果您需要/想让您的目录创建脚本成为一个独立的工具,则是在 之后对事物进行建模mktemp,这会创建它需要的内容,然后将它创建的内容的名称返回到标准输出。因此,使用以下脚本,可能称为mkcd

#!/bin/bash

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

exit $r
Run Code Online (Sandbox Code Playgroud)

然后在您的调用脚本中,您可以像这样运行:

#!/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
Run Code Online (Sandbox Code Playgroud)

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