如何将 mkdir cd 放入新创建的目录?

9 command-line bash coreutils mkdir cd-command

我经常在 bash 中键入这些命令:

mkdir something
cd something
Run Code Online (Sandbox Code Playgroud)

我几乎从不这样做:

mkdir something
ls # something in the current directory, not ./something/
Run Code Online (Sandbox Code Playgroud)

从来没有这个:

mkdir something something2
Run Code Online (Sandbox Code Playgroud)

我怎样才能mkdir cd进入新创建的目录?我的意思是,如果 I mkdir something,则命令cd something在之后立即执行。

例子:

$ pwd
/home/me
$ mkdir something
$ pwd
/home/me/something
Run Code Online (Sandbox Code Playgroud)

Ser*_*nyy 16

使用命令的最后一个参数

您不必重新键入所创建目录的名称。使用$_变量:

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

所以用法如下:

bash-4.3$ mkdir mydir
bash-4.3$ cd $_
Run Code Online (Sandbox Code Playgroud)

使用“{list;}”复合命令

如果我们只想使用一行,将命令组合成复合命令{(注意{每个命令前需要前导空格和分号):

bash-4.3$ pwd
/home/xieerqi
bash-4.3$ { mkdir mydir;cd $_;}
bash-4.3$ pwd
/home/xieerqi/mydir
Run Code Online (Sandbox Code Playgroud)

需要注意的{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
Run Code Online (Sandbox Code Playgroud)

在这里,我"$d"对两者都使用了变量,但我可以同样使用"$_"

bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$_"; } <<<'
Run Code Online (Sandbox Code Playgroud)


Rav*_*ina 15

我建议创建一个函数:

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

它做你想做的,你可以把它添加到你的,.bashrc这样它就可以在你的所有 shell 中使用。

  • $1 是您发送给函数的第一个参数,即目录名称。

你可以像这样使用它:

$ mydir ~/my-new-directory
$ pwd
~/my-new-directory
Run Code Online (Sandbox Code Playgroud)

注意:您可以更改mydirwithmkdir以覆盖它,但是我建议使用系统中不存在的自定义名称,例如mydiror cmkdir; 您可以使用type command.

  • 双引号 `$1` 以便该函数适用于包含空格的目录。 (3认同)

cho*_*oba 8

我通常遵循mkdir somethingcdAlt + .它完成与前一个命令的最后一个参数的命令,即目录名。


sud*_*dus 5

功能

您可以创建一个小函数,将其存储在文件中~/.bashrc。编辑文件以添加以下几行,

md () {
 mkdir "$1" && cd "$1"
}
Run Code Online (Sandbox Code Playgroud)

source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

为了使更改在当前终端 [window] 中起作用。当您打开新终端时,新功能将在那里。

&&在命令之间使用使cd命令仅在mkdir命令成功时运行。

示例:我可以使用这样的函数在当前目录中md创建一个测试testdir目录(在这种情况下,从提示中可以看到我的主目录),

sudodus@xenial32 ~ $ md testdir
sudodus@xenial32 ~/testdir $ 
Run Code Online (Sandbox Code Playgroud)

Bash shellscript 没有像我预期的那样工作

我还将描述我为此目的使用一个小的bash shellscript 的困难,因为其他人可能会尝试并感到困惑。

您可以在目录中存储一个 shellscript ~/bin。创建~/bin并重新启动后,它将在 PATH 中。

使用任何标准命令都没有使用的名称(例如mdscript),

#!/bin/bash

mkdir "$1" && cd "$1"
Run Code Online (Sandbox Code Playgroud)

使脚本可执行

chmod ugo+x ~/bin/mdscript
Run Code Online (Sandbox Code Playgroud)

这不符合预期

mdscript testdir
Run Code Online (Sandbox Code Playgroud)

因为当前目录只在shell-script的子进程中改变,而在shellscript完成后在终端[window]中没有改变。

它在“来源”时有效,使用命令行运行

source mdscript testdir
Run Code Online (Sandbox Code Playgroud)

但这不方便,不是原始问题的好答案。

你可以看到它是如何工作的,如果你pwd在 shellscript 中添加一个命令

#!/bin/bash

mkdir "$1" && cd "$1"
pwd
Run Code Online (Sandbox Code Playgroud)

并运行脚本 mdscript

sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $ 
Run Code Online (Sandbox Code Playgroud)