我正在开发一个项目,在我的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的选项吗?
答案 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"