我们想从变量中排除一些名称
# echo $names
abba begiz altonzon music aolala
# echo $names | grep -o '[^[:space:]]\+'
abba
begiz
altonzon
music
aolala
当我们使用egrep
以排除这两个名称时
然后我们得到以下异常:"shell-init: error retrieving current directory:"
# echo $names | grep -o '[^[:space:]]\+' | egrep -iv "abba|begiz"
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
altonzon
music
aolala
如何避免这种异常?
答案1
egrep
是某些系统中的 shell 脚本,至少 Debian 中的 shell 不喜欢在已删除的目录中启动:
$ mkdir /tmp/z
$ cd /tmp/z
$ rm -r /tmp/z
$ egrep
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
这就是 Bash as /bin/sh
,Dash 给出sh: 0: getcwd() failed: No such file or directory
直接使用grep -E
来绕过运行该 shell 脚本,或者不在已删除的目录中运行。
有关的:删除当前目录会发生什么?
完全不同的事情是,可能有一些更好的方法来完成您正在做的事情,并且不会遇到以下问题:分词和通配符。
在 Bash 中,您可以使用数组:
names=(abba begiz altonzon music aolala)
newnames=()
for x in "${names[@]}"; do
if [[ ! $x =~ ^(abba|begiz)$ ]]; then
newnames+=("$x")
fi
done
# do something with newnames