我经常在 bash 中输入以下命令:
mkdir something
cd something
我几乎从来不会这样做:
mkdir something
ls # something in the current directory, not ./something/
绝不会这样:
mkdir something something2
我怎样才能mkdir
cd
进入新创建的目录?我的意思是,如果我mkdir something
,那么命令cd something
将立即执行。
例子:
$ pwd
/home/me
$ mkdir something
$ pwd
/home/me/something
答案1
使用命令的最后一个参数
您不必重新输入所创建目录的名称。使用$_
变量:
来自 bash 4.3 手册:
_ At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list. Sub‐ sequently, expands to the last argument to the pre‐ vious command, after expansion.
因此用法如下:
bash-4.3$ mkdir mydir
bash-4.3$ cd $_
使用 '{list;}' 复合命令
如果我们只想使用一行,则将命令组合成复合命令{
(请注意,每个命令前面都需要有空格{
,并且每个命令前面都需要有分号):
bash-4.3$ pwd
/home/xieerqi
bash-4.3$ { mkdir mydir;cd $_;}
bash-4.3$ pwd
/home/xieerqi/mydir
值得注意的是,{list;}
选择这种复合命令结构是有原因的,因为列表中的所有命令都在当前 shell 环境中执行。
如果我们想避免一遍又一遍地输入所有内容,我们可以用它创建一个别名。
bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
bash-4.3$ pwd
/home/xieerqi
bash-4.3$ mkcd "mydir"
bash-4.3$ pwd
/home/xieerqi/mydir
这里我"$d"
对两者都使用了变量,但我也可以同样使用"$_"
:
bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$_"; } <<<'
答案2
我建议创建一个函数:
function mydir(){ mkdir -p "$1" && cd "$1"; }
它可以满足您的需要,您可以将它添加到您的.bashrc
所有 shell 中,以便它可以在您的所有 shell 中使用。
$1
是您发送给函数的第一个参数,即目录的名称。
你可以像这样使用它:
$ mydir ~/my-new-directory
$ pwd
~/my-new-directory
注意:您可以使用mydir
来mkdir
更改它,但是我建议使用系统中不存在的自定义名称,如mydir
或cmkdir
;您可以使用来检查命令是否存在type command
。
答案3
我通常会mkdir something
用cd
Alt + .前一个命令的最后一个参数(即目录名)来完成该命令。
答案4
功能
你可以做一个小功能,您可以将其存储在文件中~/.bashrc
。编辑文件以添加以下行,
md () {
mkdir "$1" && cd "$1"
}
跑步
source ~/.bashrc
以使更改在当前终端 [窗口] 中生效。当您打开新终端时,新功能将会出现。
使用&&
命令之间的区别在于,cd
只有mkdir
命令成功执行时,命令才会运行。
例子:我可以使用这样的函数在当前目录(在本例中是从提示符中看到的我的主目录)中md
创建一个测试目录,testdir
sudodus@xenial32 ~ $ md testdir
sudodus@xenial32 ~/testdir $
Bash shellscript 未按预期工作
我也会用一个小例子来描述我的困难bash 脚本为了这个目的,因为其他人可能会尝试并感到困惑。
您可以在目录中存储 shell 脚本~/bin
。创建~/bin
并重启后,它将位于 PATH 中。
使用任何标准命令都未使用的名称(例如mdscript
),
#!/bin/bash
mkdir "$1" && cd "$1"
使脚本可执行
chmod ugo+x ~/bin/mdscript
这不能按预期工作
mdscript testdir
因为当前目录只在shell脚本的子过程中发生了改变,而在完成shell脚本后在终端[窗口]中没有改变。
它在“sourced”时有效,使用命令行运行
source mdscript testdir
但这并不方便,不是对原始问题的好答案。
pwd
如果你在 shellscript 中添加一个命令,你可以看到它是如何工作的
#!/bin/bash
mkdir "$1" && cd "$1"
pwd
并运行脚本mdscript
sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $