如何运行cd -
命令而不回显任何输出?
我试过了cd - 2>&1 /dev/null
,但打印出了目标目录。
原因是我想将其用作 bash 函数,并且不希望有不必要的输出。
答案1
尝试一下:
cd - > /dev/null
您还可以执行以下操作:
cd - > uselessfile
这会将输出发送到“uselessfile”文件而不是 STDOUT。
您还可以附加文件,而不是创建或覆盖文件。
cd - >> uselessfile
答案2
@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 的命令。有两种方法可以做到这一点。
对于您来说,最简单的方法是通过添加一个字符来通知 shell 您想要重定向>
。这是 @erewok 所建议的。
cd - 2>&1 >/dev/null
这首先将 stderr(文件描述符 2)重定向到文件描述符 1(stdout),然后将 stdout(隐式 1)重定向到 /dev/null。请注意,顺序很重要;如果您反转重定向,您将不会得到相同的结果,尽管在某些情况下,由于特定程序使用相应输出流的方式,您可能会得到相同的结果。
或者,正如@demure&>
,如果您的 shell 支持此语法,您可以使用它来同时重定向两个流。
cd - &>/dev/null
请注意$OLDPWD
这些替代方案中的任何一个都会在错误不再存在时使错误静音,因为您正在将标准错误输出重定向到系统黑洞。如果这是一个问题,我会$?
事后检查;如果这是一个真正的问题,您应该自己确认这一点,但至少在我的测试中,在成功之后会设置失败cd
(是否cd $someplace
或cd -
)。$? = 1
$? = 0
答案3
您可以使用:
cd ~-
根据 bash 手册页Tilde Expansion
:
如果波浪号前缀是“~-”,则使用 shell 变量 OLDPWD 的值(如果已设置)进行替换。
答案4
重定向 stdout 和 stderr:
cd - &>/dev/null
这&>
是的简写版本cd - 2>/dev/null 1>&2
,我认为您想要使用它......
- 注意
&>
需要 bash >= 4.0。
附言:大多数命令都可以指向位置,因此你不太可能真正需要cd