Answers:
@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 $someplace
或cd -
)套$? = 1
,而成功之后$? = 0
。
也许你可以使用
cd $OLDPWD
但是在这种情况下,您需要输入更多信息:)
但是您会有一个优势:如果出现任何错误,消息将不会重定向到/ dev / null。
cd /tmp
bash
cd -
说,bash: cd: OLDPWD not set
在第二张光盘; 而该序列cd /tmp
bash
cd $OLDPWD
会将您放入〜(几乎可以肯定,因为$ OLDPWD扩展为空字符串)。cd $OLDPWD
一旦cd
在相关外壳程序中至少完成了一项操作,它将正常工作,但是在此之前没有。
$OLDPWD
未设置,这将使您进入~
。cd -
会打印一个错误(并可能使您离开原本的位置)。