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 手册:
Run Code Online (Sandbox Code Playgroud)_ 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 $_
Run Code Online (Sandbox Code Playgroud)
如果我们只想使用一行,将命令组合成复合命令{(注意{每个命令前需要前导空格和分号):
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.
您可以创建一个小函数,将其存储在文件中~/.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 的困难,因为其他人可能会尝试并感到困惑。
您可以在目录中存储一个 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)