Combined `mkdir` and `cd`?

Jas*_*per 189 bash cd-command mkdir

is there any way (what is the easiest way in bash) to combine the following:

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

的联机帮助页mkdir没有描述类似的内容,也许有一个花哨的版本mkdir?我知道这cd必须是 shell 内置的,所以花哨的也是如此mkdir......

别名?

Zaj*_*ajn 322

我认为创建一个函数是最合适的方法,但为了列出所有替代方法,您可以编写:

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

$_是一个特殊参数,用于保存上一个命令的最后一个参数。周围的引号$_确保即使文件夹名称包含空格也能正常工作。

为什么要使用双引号?

在某些 shell(例如 )中zsh$_即使目录名称包含空格,也不需要将 括起来的双引号。bash但是,此命令需要它们才能在 中工作。

例如,在 macOS 10.13.6 上的 bash 3.2.57 中运行此命令:

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

导致此输出:

mkdir "my directory" && cd $_
Run Code Online (Sandbox Code Playgroud)

但是,如果我们$_用双引号括起来,则命令会成功返回。

bash: cd: my: No such file or directory
Run Code Online (Sandbox Code Playgroud)

  • `$!` 的同一行版本,在这种情况下,是 `!#:1`。即`"$_"`可以替换为`!#:1`。 (3认同)
  • 在此示例中,@nyxee `$_` 的值将是 `foo`。如果我改为输入 `mkdir workspace`,`$_` 的值将是 `workspace`,而 `cd "$_"` 会将我们的当前目录更改为新创建的 `workspace`。那有意义吗? (2认同)
  • @harperville 答案末尾出现错误的原因是为了证明在某些 shell 中需要将 `$_` 括起来,即 `bash`。也许我应该重新表述该部分以更清楚地说明没有“$_””,这就是您将看到的错误。 (2认同)

Ouk*_*uki 153

功能?

mkcdir ()
{
    mkdir -p -- "$1" &&
      cd -P -- "$1"
}
Run Code Online (Sandbox Code Playgroud)

摆在上面的代码~/.bashrc或由源的另一个文件~/.bashrc。然后重新启动终端以应用更改。

之后只需运行mkcdir foomkcdir "nested/path/in quotes"

笔记:

  • "$1"mkcdir命令的第一个参数。如果它有空格或其他特殊字符,它周围的引号会保护参数。
  • --确保新目录的传递名称不会被解释为mkdir或的选项cd,从而有机会创建以-或开头的目录--
  • -p使用 onmkdir使其创建额外的目录(如果它们尚不存在),并-P使用使cd解析符号链接。

  • 如果有人想知道,使用的 `-P` 使 cd 解析符号链接。mkdir 上使用的 `-p` 使它创建额外的目录,如果它们还不存在的话。 (21认同)
  • @Zaz `-- ` 用于确保以下参数不被解析为修改命令行为的选项。在这种情况下,它确保新目录的传递名称不会被解释为 mkdir 或 cd 的选项,从而提供创建以 - 或 -- 开头的目录的选项。 (18认同)
  • 如果参数有空格,`"$1"` 周围的引号将保护它。 (11认同)
  • 并将其放在 .bashrc 中? (11认同)
  • `--` 的目的是什么? (6认同)

Lek*_*eyn 25

Bash(使用单词指示符):

/tmp/bug$ mkdir "some dir"
/tmp/bug$ cd !$
cd "some dir"
/tmp/bug/some dir$ 
Run Code Online (Sandbox Code Playgroud)

!$扩展到历史记录中上一行的最后一个参数。如果中间有参数,则可以将其!:1用于第一个参数、!:2第二个参数等。

来自 bash(1):

事件指示符

事件指示符是对历史列表中命令行条目的引用。除非引用是绝对的,否则事件是相对于历史列表中的当前位置的。

! 开始历史替换,除非后跟空白、换行、回车=((使用 shopt 内置程序启用 extglob shell 选项时)。

[..]

单词指示符

单词指示符用于从事件中选择所需的单词。A:将事件规范与词指示符分开。[..]

[..]
nn个单词。
^ 第一个论点。即第 1
$ 个字。最后一个字。这通常是最后一个参数,但如果行中只有一个单词,则会扩展到第零个单词。

  • `!$` 更短,更容易在许多键盘上输入。另见 `<Alt-.>` 或 `<Alt-_>` (4认同)

小智 10

这些其他小伙子只是让生活变得复杂,这里是:

eval {mkdir,cd}\ FOLDER\;
Run Code Online (Sandbox Code Playgroud)

  • @BroSlow 这没有将“eval”与用户输入一起使用,所以没关系。不要搞货物崇拜。 (5认同)
  • 我真的很想创建一个名为“FOLDER && rm ../something”的目录。但是`eval`不会让我:*( 可悲的是,在复杂与[邪恶]的战斗中可能不得不选择复杂(http://mywiki.wooledge.org/BashFAQ/048)。 (2认同)
  • @MilesRout 如果您只将它用于名为“FOLDER”的目录,当然,这很好。这不是重点,如果您将它与变量输入一起使用(您几乎肯定会这样做),那么奇怪的目录名称的结果充其量会导致意外结果,最坏的情况会带来安全风险。 (2认同)