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

标签 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 是我唯一的选择吗?

最佳答案

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

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

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

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


另一种选择,如果你需要/想要让你的目录创建脚本成为一个独立的工具,是在 mktemp 之后建模,它创建它需要的东西,然后返回它的名字创建到标准输出。因此,使用以下脚本,可能称为 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

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

关于linux - bash 脚本来创建和 cd 到名称中有空格的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36381014/

相关文章:

linux - 在 .bashrc 中测试 GUI

unix - 在 Unix 中没有临时文件的粘贴

bash - grep - 列出不包含两种模式的所有行

linux - 如何设置 cron 在特定时间只运行一次文件?

unix - Sed 用大文件替换第一次出现的地方

python - gcc 找不到 Python.h

python - systemd 服务无法启动 bash 脚本

linux - SSH 连接到 Ubuntu 打开 SSH 服务器需要先通过密码登录(物理)服务器

c++ - 在arm chromebook上编译taskwarrior的未定义引用

bash - grep、tee 和 sleep 一起玩得不好