有什么方法(bash中最简单的方法)来合并以下内容:
mkdir foo
cd foo
mkdir
的联机帮助页没有描述类似的内容,也许有一个花哨的mkdir
版本?我知道cd
必须是shell内置的,所以花哨的mkdir
也是如此... 别名?
#1 楼
mkcdir ()
{
mkdir -p -- "" &&
cd -P -- ""
}
将上面的代码放在
~/.bashrc
或~/.bashrc
派生的另一个文件中。然后重新启动终端以应用更改。之后,只需运行
mkcdir foo
或mkcdir "nested/path/in quotes"
即可。注意:
""
是mkcdir
命令的第一个参数。如果引号周围有空格或其他特殊字符,则引号会保护该引数。--
确保新目录的传递名称不会被解释为mkdir
或cd
的选项,从而有机会创建一个以-
或--
开头的目录。-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
评论
您不能将两个命令直接别名在一起。