and*_*tse 28 shell cp wildcards
我目前正在寻找在 Linux 中抑制错误命令的方法,特别是命令cp.
我愿意:
root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/.
cp: cannot stat `/srv/ftp/201*/wha*/*.jj': No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何抑制打印在屏幕上的错误消息?即,我不想在显示器中看到此错误消息。
Joh*_*ohn 58
要抑制 中的错误输出bash,请附加2>/dev/null到命令的末尾。这会将文件句柄 2 (STDERR) 重定向到/dev/null. 其他 shell 中也有类似的构造,但具体构造可能略有不同。
hee*_*ayl 12
将错误消息 (STDERR) 重定向到/dev/null:
root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/. 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
例子:
$ 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
Run Code Online (Sandbox Code Playgroud)
你的问题不清楚。最明智的做法是cp在通配符不匹配任何文件时根本不运行,而不是运行cp并隐藏错误消息。
为此,如果 shell 是 bash,请设置该nullglob选项,以便通配符模式在不匹配任何文件时扩展为空。然后检查模式是否扩展为任何内容,cp在这种情况下不要调用。
#!/bin/bash
shopt -s nullglob
files=(/srv/ftp/201*/wha*/*.jj)
if [[ ${#files[@]} -ne 0 ]]; then
cp "${files[@]}" ~
fi
Run Code Online (Sandbox Code Playgroud)
在普通 sh 中,测试 glob 是否保持不变,指向一个不存在的文件。
set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
cp "$@" ~
fi
Run Code Online (Sandbox Code Playgroud)