如何抑制来自cp的错误消息?


13

我目前正在寻找抑制Linux中错误命令的方法,尤其是command cp

我做:

root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/.
cp: cannot stat `/srv/ftp/201*/wha*/*.jj': No such file or directory

如何抑制获取错误信息在屏幕上?即,我不想在监视器中看到此错误消息。


1
仅供参考,检查错误的最佳方法是退出代码。将STDERR管道传递到/ dev / null是标准操作,并且可以消除任何可视化的错误指示,但是检查非零返回状态将使您知道是否存在错误,至少这应该是这样...
内森·麦考伊

您的问题不清楚。您要隐藏cp中的所有错误消息吗?或者,如果通配符与任何文件都不匹配,您是否希望没有错误消息?还是其他一些标准?
吉尔(Gilles)'所以

Answers:


38

要取消中的错误输出bash,请追加2>/dev/null到命令末尾。这会将文件句柄2(STDERR)重定向到/dev/null。其他外壳中也有类似的构造,尽管具体构造可能会略有不同。


想知道为什么我从未想过那个xx
阿卜杜勒

8

将错误消息(STDERR)重定向到/dev/null

root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/. 2>/dev/null

例:

$ cp /srv/ftp/201*/wha*/*.jj ~/.  ##Error message gets printed
cp: cannot stat ‘/srv/ftp/201*/wha*/*.jj’: No such file or directory

$ cp /srv/ftp/201*/wha*/*.jj ~/. 2>/dev/null  ##No error message gets printed

5

您的问题不清楚。最明智的做法是cp在通配符与任何文件都不匹配时完全不运行,而不是运行cp并隐藏错误消息。

为此,如果外壳为bash,请设置nullglob选项,以使通配符模式在与任何文件都不匹配时扩展为空。然后检查模式是否扩展为任何东西,cp在这种情况下不要调用。

#!/bin/bash
shopt -s nullglob
files=(/srv/ftp/201*/wha*/*.jj)
if [[ ${#files[@]} -ne 0 ]]; then
  cp "${files[@]}" ~
fi

在普通sh中,测试glob是否保持不变,指向不存在的文件。

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi

如果您不希望cp从shell脚本中引发错误,那么这是必需的技术-至少,我不是专家,但这似乎很有效。
NessBird

0

将此添加到〜/ .bashrc中:

alias cp='cp 2> /dev/null'

然后:

source ~/.bashrc

2
建议永久执行此操作对我来说似乎很愚蠢。当不需要输出错误时,通过管道stderr传递似乎是一个更好的主意/dev/null。或使用不同于的名称cp
HalosGhost

我同意您的意见,但这是不希望在监视器上看到任何错误消息的人的解决方案cp
M122

-1

您可以使用:
1个选项:2>/dev/null
2个选项:2>&1
除了可以在命令末尾使用它之外,它还将禁止显示错误消息:

这里的例子

$cp nofile.txt b.txt > log.txt 2>/dev/null

在这里,您无法获取有关错误消息的任何信息。示例2:

$cp nofile.txt b.txt > log.txt 2>&1

在这里,您可以从下面的日志文件中检索一些信息:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
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.