很久以前,我创建了一个脚本,用于使用命令up在命令行中非常快速地向上移动目录。您可以在此处找到使用说明。

这是一个非常简单的脚本,仅包含8行源代码,如下所示:

if [ -z "" ]; then
    cd ..
else
    for i in `seq 1 `;
    do
        cd ..
    done
fi


I'自从我自己制作并开始使用它以来,我个人从未遇到过任何问题-但是是否有任何偶然或恶意的输入(尤其是的盲注)可能会导致它做一些我不知道的坏事?

鉴于up命令在我知道的任何命令行中均未用于任何命令,我想推广此脚本文件的更广泛使用,以便人们可以代替键入始终保持up的数量,从而节省了三个击键(如果需要向上移动更多目录,则可以节省更多),以进行非常常见的操作。

评论

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使用情况。]

#1 楼

建议您定义alias up=". path/to/up",以便在键入up 3时将其扩展为. up 3。但是,由于要使用可选参数并影响当前shell的状态,所以我认为最好改定义shell函数。不需要,因为[ -z "" ]只是扩展为seq 1。这会导致一个可用性错误:1cd ..,它们通常会将您带回到上一个目录,但无法按我期望的方式工作。

评论


\ $ \ 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 \ $
在我的解决方案中,我的工作范围是一个subshel​​l。 $ 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