up
在命令行中非常快速地向上移动目录。您可以在此处找到使用说明。这是一个非常简单的脚本,仅包含8行源代码,如下所示:
if [ -z "" ]; then
cd ..
else
for i in `seq 1 `;
do
cd ..
done
fi
I'自从我自己制作并开始使用它以来,我个人从未遇到过任何问题-但是是否有任何偶然或恶意的输入(尤其是
的盲注)可能会导致它做一些我不知道的坏事?鉴于
up
命令在我知道的任何命令行中均未用于任何命令,我想推广此脚本文件的更广泛使用,以便人们可以代替键入始终保持up
的数量,从而节省了三个击键(如果需要向上移动更多目录,则可以节省更多),以进行非常常见的操作。#1 楼
建议您定义alias up=". path/to/up"
,以便在键入up 3
时将其扩展为. up 3
。但是,由于要使用可选参数并影响当前shell的状态,所以我认为最好改定义shell函数。不需要,因为[ -z "" ]
只是扩展为seq 1
。这会导致一个可用性错误:1
或cd ..
,它们通常会将您带回到上一个目录,但无法按我期望的方式工作。 评论
\ $ \ begingroup \ $
因此,以这种方式进行定义会使文字cd变得无用?还是您期望-也能像CD一样工作?
\ $ \ endgroup \ $
–乔Z。
15-10-26在1:06
\ $ \ begingroup \ $
@JoeZ。前者cd将在n大于1的情况下调用n之后使您返回上一级。如果您想返回到调用n之前的位置,则会导致问题。将命令连接到单个cd中可以保留功能。
\ $ \ endgroup \ $
–蜘蛛鲍里斯(Boris)
15-10-26在16:18
\ $ \ begingroup \ $
这是一个非常优雅的解决方案,应该被接受。荣誉
\ $ \ endgroup \ $
–通配符
15年11月29日在8:27
#2 楼
这是一个不错的概念,但是通过在cd
上循环,您可以在外壳中释放$OLDPWD
函数的某些值。例如,我经常在外壳中使用特殊的构造cd -
,并将目录更改为您以前使用过的构造。相反,建议您改为建立一个../
字符串值链,例如4个目录的../../../../
,然后仅调用一次cd
,这将保留cd -
函数和$OLDPWD
。此外,将它作为功能而不是脚本包含在代码中将是一个很好的功能。 Bash shell喜欢函数,它们使生活更轻松。
最后,如果有人提供一个非数字作为参数,它将做奇怪的事情。代码,并提出:
up () {
local count=
if [ -z "$count" ]; then
cd ..
return
fi
test "$count" -eq "$count" || return 1
local todir=""
for i in `seq 1 $count`;
do
todir="../$todir"
done
cd $todir
}
我喜欢上面代码的功能是:
它是一个函数
,它通过对值进行数字比较来检查值是否为数字:
test "$count" -eq "$count"
(如果输入不是整数,则将引发错误)。它只做一个'cd',所以像
cd -
这样的东西仍然可以工作。#3 楼
200_success的答案使用了邪恶的eval
,这在他的上下文中是不必要的。更新:哦,什么,bash?让我们使用一些大括号扩展+邪恶的东西:
# This time we have to be evil. All code in this answer is CC0.
up() { [ "" -eq "" ] &>/dev/null || set -- 1; "cd $(printf '../%.s' {1..})"; }
不是一个很好的解决方案,因为POSIX不包含local
。经过一番搜索,我发现可以使用printf复制字符串。用local
代替花括号扩展后,得到的结果如下: 。使您减少内感:up() { cd "$(printf '../%.s' $(seq 1 ))"; }
评论
\ $ \ begingroup \ $
在我的解决方案中,我的工作范围是一个subshell。 $ i的先验值对执行没有影响,执行也不会改变主外壳中$ i的值。
\ $ \ endgroup \ $
– 200_success
15-10-26在0:38
\ $ \ begingroup \ $
@ 200_success哦,对了,命令替换。
\ $ \ endgroup \ $
–王明业
2015年10月26日,0:46
\ $ \ begingroup \ $
@ 200_success但是您实际上仍然不需要该评估。
\ $ \ endgroup \ $
–王明业
15-10-26在0:47
#4 楼
您可能希望转发传递给cd
的所有选项,尤其是-L
,-P
,-e
和-@
。幸运的是,这些参数都不带任何参数,因此很容易抓住它们:我可以将其命名为
..
而不是up
。评论
\ $ \ begingroup \ $
您要[1-9] *还是([1-9] [0-9] *)?如果输入10,会发生什么?
\ $ \ endgroup \ $
–乔Z。
18年11月8日23:35
\ $ \ begingroup \ $
我将它们与正则表达式混淆。谢谢你告诉我。
\ $ \ endgroup \ $
–乔Z。
18年11月11日在3:22
\ $ \ begingroup \ $
嗯,是的,我的意思是正则表达式-抱歉造成混乱。无论如何,有10场比赛(我测试过)。
\ $ \ endgroup \ $
– Toby Speight
18-11-12在11:03
\ $ \ begingroup \ $
如果输入1P会怎样?
\ $ \ endgroup \ $
–乔Z。
18年11月12日在18:03
\ $ \ begingroup \ $
然后测试“ $ i” -eq“ $ i”失败,什么也没有发生(如果它向用户显示错误消息会更好;这是读者的练习)
\ $ \ endgroup \ $
– Toby Speight
18年11月12日在18:05
评论
zsh:...另外,...,....,.....,...@ naught101:这就是为什么我将此问题标记为bash的原因。 :P
好的方法,但是我只是使用别名f ='cd ..;'; alias ff ='cd ..; cd ..;'alias fff ='cd ..; cd ..; cd ..;'; alias ffff ='cd ..; cd ..; cd ..; cd ..;';别名fffff ='cd ..; cd ..; cd ..'; cd ..; cd ..;在bashrc中,因为您只想上来很多次,并且可以轻松访问“ f”键。只需输入几次“ f”,然后按Enter键而不是输入up5。“ f”代表“ fall”,因为从小我就认为cd dirName是“攀登”目录,而cd ..是从爬升的目录掉下来。
@Nav:如果这样做,为什么不使用ff的cd ../ ..?您手动进行了独立迭代。
我对CD带我回家感到很满意。由于我拥有和处理的所有文件都在其中。通常,回到工作文件的深度少于四到五个。虽然更常见的是cd〜/ where / ever /。 [一般来说我的CD使用情况。]