使用“ cd-”而没有任何输出


28

如何在cd -不回显任何输出的情况下运行命令?
我试过了,cd - 2>&1 /dev/null但是会打印出目标目录。
这样做的原因是,我想将其用作bash函数,并且希望不要有不必要的输出。

Answers:


32

像这样尝试:

cd - > /dev/null

您也可以:

cd - > uselessfile

这会将输出发送到“ uselessfile”文件,而不是发送到STDOUT。

您也可以添加而不是创建或覆盖文件。

cd - >> uselessfile

15

@erewok已经回答了这个问题,但是我将尝试解释实际发生的事情以及为什么您看到自己的行为。

问题出在您的重定向上。您正在写:

cd - 2>&1 /dev/null

因为重定向可以出现在命令行中的任何位置(您可以使用像这样的简单内容来确认自己echo a b 2>&1 c </etc/fstab d),所以剥离重定向后,它实际上变为:

cd - /dev/null

看到问题了吗?您要将两个参数传递给cd,而不是一个参数和两个重定向。由于您一次只能位于一个当前目录中,因此cd仅考虑其第一个参数,在这种情况下为-

您可能打算编写的cd命令是将stderr和stdout都重定向到/ dev / null。有两种方法可以做到这一点。

在这种情况下,最简单的方法是,通过添加一个>字符,简单地通知外壳程序您要重定向。这就是@erewok的建议。

cd - 2>&1 >/dev/null

这首先将stderr(文件描述符2)重定向到文件描述符1(stdout),然后将stdout(隐式1)重定向到/ dev / null。请注意,顺序很重要;如果您将重定向反向,则不会得到相同的结果,尽管在某些情况下,由于特定程序如何使用各自的输出流,您可能会这样做。

另外,如@demure所建议,&>如果外壳支持此语法,则可以使用一次同时重定向两个流。

cd - &>/dev/null

请注意$OLDPWD,由于您将标准错误输出重定向到系统黑洞中,因此这些替代方法中的任何一种也将使错误不再存在。如果这是一个问题,我会在$?之后检查;您应该确认这个自己,如果它是一个真正的问题,但至少在我的测试中,失败的cd(无论是cd $someplacecd -)套$? = 1,而成功之后$? = 0


5

也许你可以使用

cd $OLDPWD

但是在这种情况下,您需要输入更多信息:)

但是您会有一个优势:如果出现任何错误,消息将不会重定向到/ dev / null。


1
如果$OLDPWD未设置,这将使您进入~cd -会打印一个错误(并可能使您离开原本的位置)。
CVn

1
你说的不对。如果未设置$ OLDPWD(为什么?也许用户可以取消设置),则“ cd-”的结果与“ cd $ OLDPWD”相同。检查手册页(“ cd-”等效于“ cd“ $ OLDPWD” && pwd')。或者您可以测试它:)'OLDPWD =“”; cd-'-看到您会进入〜并打印一个〜字符。
uzsolt

1
我刚刚测试过。在我的系统,顺序cd /tmp bash cd -说,bash: cd: OLDPWD not set在第二张光盘; 而该序列cd /tmp bash cd $OLDPWD会将您放入〜(几乎可以肯定,因为$ OLDPWD扩展为空字符串)。cd $OLDPWD一旦cd在相关外壳程序中至少完成了一项操作,它将正常工作,但是在此之前没有。
的CVn

嗯,是的,你是对的。我已经使用zsh进行了测试,并且使用zsh不会丢弃错误消息。
uzsolt

1

重定向标准输出和标准错误: cd - &>/dev/null

&>是的简写版本cd - 2>/dev/null 1>&2,我认为您打算使用...。

  • 注意&>需要bash> = 4.0。

附言 大多数命令都可以指向位置,因此您实际上不太可能需要cd


0

您可以使用:

cd ~-

根据bash手册页的内容Tilde Expansion

如果波浪号前缀为“〜-”,则替换外壳变量OLDPWD的值(如果已设置)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.