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

Bat*_*dwa 36 bash

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

ere*_*wok 40

像这样尝试:

cd - > /dev/null
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

cd - > uselessfile
Run Code Online (Sandbox Code Playgroud)

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

您还可以追加而不是创建或覆盖文件。

cd - >> uselessfile
Run Code Online (Sandbox Code Playgroud)


use*_*ser 18

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

问题在于您的重定向。你在写:

cd - 2>&1 /dev/null
Run Code Online (Sandbox Code Playgroud)

这是因为重定向可以出现在命令行中的任何地方(您可以使用简单的方法自己确认这一点echo a b 2>&1 c </etc/fstab d),在重定向被剥离后实际上变成:

cd - /dev/null
Run Code Online (Sandbox Code Playgroud)

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

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

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

cd - 2>&1 >/dev/null
Run Code Online (Sandbox Code Playgroud)

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

或者,正如@demure所建议的那样&>如果您的 shell 支持此语法,您可以使用一次重定向两个流。

cd - &>/dev/null
Run Code Online (Sandbox Code Playgroud)

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


uzs*_*olt 7

也许你可以用

cd $OLDPWD
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,您需要输入更多内容:)

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


小智 5

您可以使用:

cd ~-
Run Code Online (Sandbox Code Playgroud)

根据 bash 手册页Tilde Expansion

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