为什么我们在使用egrep时得到shell-init:错误检索当前导演

为什么我们在使用egrep时得到shell-init:错误检索当前导演

我们想从变量中排除一些名称

# 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

相关内容