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 的唯一选择吗?
当您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)
请注意,错误检查仍然是一个好主意,即使它看起来是多余的,因为如果使用特殊字符或奇怪的格式来构建目录名称,人们可能会成为意外或有意的不可预测行为的受害者。