检索当前目录时出错:getcwd:无法访问父目录

问题描述 投票:0回答:8

我有一个简单的脚本:

#!/bin/bash
for server in $(~/.ansible/ansible_hosts)
do
    ssh $server "hostname; readlink /opt/mydir/mylink;"
done

它工作正常 - 程序返回正确的主机名和链接 - 除了我在某些但不是全部服务器上收到以下错误:

shell-init:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录

所有目录都存在。最常见的建议之一是添加 cd、cd - 或 cd /。添加该步骤时发生的所有事情都是额外的:

chdir:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录

我尝试启动 nfs 守护进程,以防我的 homedir 存在一些混乱,并替换 /etc/init.d,以防问题出在 /opt 上。没有区别

这只会是一个烦恼,除非当我尝试使用 ansible playbook 而不是简单的 ssh 命令时,该服务器会失败。

任何见解将不胜感激。

linux bash shell ssh ansible
8个回答
229
投票

该错误很可能与脚本根本无关。问题是:当您尝试运行脚本时所在的目录不再存在。例如,您有两个终端,第一个终端为

cd somedir/
,第二个终端为
mv somedir/ somewhere_else/
,然后尝试在第一个终端中运行任何内容 - 您将收到此错误消息。

请注意,即使您重新创建同名目录,您也会收到此错误,因为新目录将具有不同的 inode 索引。


83
投票

在 Mac 上,只需终止并重新启动终端即可。它会做对的。


42
投票

根据这个答案,当“您重新创建目录”但该位置已经有一个shell时,就会发生这种情况,所以我们可以简单地运行:

cd ~ && cd -

注意:如果您使用 zsh 并最终处于这种状态,您可能会在提示符开头看到一个锁定图标 🔒(这通常表明您没有写入权限)。


5
投票

在 mac 终端上打开一个新选项卡对我有用。


2
投票

我在为测试用例创建和删除测试文件的

unittest
方法中的
tearDown
中也遇到了同样的错误。奇怪的是,即使我有要通过 for 循环删除的目录的完整路径,我也必须先提供
os.chdir(path_where_dirs_at)
才能消除错误。不知道这是否是一个好的解决方案,但消息消失了。


1
投票

您正在将其作为脚本执行.. $(~/.ansible/ansible_hosts)。 $() 意味着 bash 将尝试执行该脚本,然后输出结果。

但这不是剧本,对吧?这是主机列表!

只需添加单词

cat
就可以了。

#!/bin/bash
for server in $(cat ~/.ansible/ansible_hosts)
do
    ssh $server "hostname; readlink /opt/mydir/mylink;"
done

1
投票

我在 Colab 突然无法浏览目录

中找到了类似问题的解决方案

不会丢失 Colab 实例中的变量,

使用 os 库更改目录。

import os
path = "/content" # /content is pretty much the root. you can choose other path in your colab workspace
os.chdir(path)

此解决方案有效,不需要重新启动运行时(并丢失所有数据)。


-2
投票

也许是因为第一行“#!/bin/bash”。 尝试其他的,例如:#!/bin/ksh

© www.soinside.com 2019 - 2024. All rights reserved.