有什么方法(bash中最简单的方法)来合并以下内容:

mkdir foo
cd foo


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

别名?

评论

您不能将两个命令直接别名在一起。

#1 楼



mkcdir ()
{
    mkdir -p -- "" &&
      cd -P -- ""
}


将上面的代码放在~/.bashrc~/.bashrc派生的另一个文件中。然后重新启动终端以应用更改。

之后,只需运行mkcdir foomkcdir "nested/path/in quotes"即可。

注意:




""mkcdir命令的第一个参数。如果引号周围有空格或其他特殊字符,则引号会保护该引数。

--确保新目录的传递名称不会被解释为mkdircd的选项,从而有机会创建一个以---开头的目录。

-p上使用的mkdir可以创建额外的目录(如果尚不存在),而-P可以使cd解析符号链接。


评论


如果引号中包含空格,则引号“ $ 1”将保护该参数。

–格伦·杰克曼
2014年4月18日在13:33

并将其放在.bashrc中?

–碧玉
14年4月18日在14:05

-的目的是什么?

–扎兹
16年11月12日在21:25

@Zaz-用于确保不将以下参数解析为修改命令行为的选项。在这种情况下,请确保新目录的传递名称不会被解释为mkdir或cd的选项,从而提供了创建以-或-开头的目录的选项。

–immeëmosol
17年1月4日在11:12

如果有人想知道,使用的-P可以使cd解析符号链接。 mkdir上使用的-p使其创建额外的目录(如果尚不存在)。

–immeëmosol
17年1月4日在11:14

#2 楼

我认为创建函数是执行此操作的最合适方法,但是仅列出所有其他方法,您可以这样写:

mkdir foo && cd "$_"


$_是保存上一个命令的最后一个参数。 $_周围的引号确保即使文件夹名称包含空格也可以使用。

为什么要使用双引号?

在某些外壳中,例如zsh,请在双引号周围加上双引号即使目录名称包含空格,也不需要$_。但是,此命令才能在bash中运行。

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

 mkdir "my directory" && cd $_
 


结果如下:

 bash: cd: my: No such file or directory
 


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

 bash-3.2$ mkdir "my directory" && cd "$_"
bash-3.2$ echo $?
0
bash-3.2$
 


评论


$!的同一行版本为!#:1。即“ $ _”可以替换为!#:1。

–antak
16 Dec 7'在5:33

在此示例中,@ nyxee $ _的值为foo。如果我改为键入mkdir工作区,则$ _的值将是工作区,而cd“ $ _”会将当前目录更改为新创建的工作区。那有意义吗?

– Zajn
17年2月23日在15:56

为什么要加上双引号?我只是尝试了,没有它就可以工作。另外,它看起来真的很丑,可能会阻止某些人

– Suhaib
17年8月9日在5:38

@SHiON创建包含空格的目录时,必须在bash中添加双引号。由于该问题被标记为bash,因此我作了相应回答。

– Zajn
18-10-2在18:52

@harperville答案结尾错误的原因是证明在某些外壳(即bash)中需要用$ _引起的引号。也许我应该重新命名该部分,以更清楚地说明没有“ $ _”,这就是您将看到的错误。

– Zajn
19年1月15日在20:52



#3 楼

重击(使用单词指示符):

/tmp/bug$ mkdir "some dir"
/tmp/bug$ cd !$
cd "some dir"
/tmp/bug/some dir$ 


!$扩展到历史记录中前一行的最后一个参数。如果您在两者之间有参数,则可以将!:1用作第一个参数,将!:2用作第二个参数,依此类推。

从bash(1):



事件指示符

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

!开始历史记录替换,但后跟空白,
换行符和回车返回,=((使用内置的shopt启用extglob shell选项时。)。

[..]

单词指示符

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

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


评论


我认为在大多数情况下,“ !: 1”会与“ $ firstfewcharactersofnewdir + TAB”相对。

–碧玉
14年4月18日在14:19

@Jasper我很少使用!:1,但是如果您的路径具有不唯一的前缀,则可以选择使用@:Jasper。

– Lekensteyn
14年4月18日在14:34

!$更短,更容易在许多键盘上键入。另请参见

–StéphaneChazelas
2014年4月18日14:51



@StephaneChazelas Alt +之间有什么区别。和Alt + _?

–伯恩哈德
14年4月18日在19:03

@bernard,您可以在参数列表中前进和后退。请参见bash的手册页。

– Lekensteyn
14年4月18日在19:58

#4 楼

这些其他小伙子们只是使生活变得复杂,就在这里:

eval {mkdir,cd}\ FOLDER\;


评论


我真的很想创建一个名为“ FOLDER && rm ../something”的目录。但是eval不会让我:*(可悲的是,在复杂与邪恶的战斗中,可能不得不选择复杂。

–user60101
2014年4月19日在2:14



@BroSlow,那么您就必须找到另一个操作系统,因为从未允许在文件名中使用斜杠!至于其他角色,即使逃脱也能正常工作。

– Sean D
2014年4月19日在10:20

@SeanD你想念我的意思。在用户输入中使用eval通常不是一个好主意,eval会处理FOLDER && rm ../某物而不是FOLDER,而不会提出投诉。或者,对于另一个变体,“ FOLDER && rm -r $ HOME”如何?

–user60101
2014年4月19日在17:28



@BroSlow这不与用户输入一起使用eval,所以很好。不要崇拜。

–Miles Rout
16年1月30日,下午6:56

@MilesRout如果只将其用于名为FOLDER的目录,则可以。这不是重点,如果将它与变量输入一起使用(几乎可以肯定要使用),那么奇怪的目录名的结果充其量只能导致意外的结果,最坏的情况是存在安全风险。

–user60101
16-2-1在1:36