我有一个简单的脚本:
#!/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存在一些混淆,并且如果问题是/ opt,则替换/etc/init.d。没有区别
这只是一个烦恼,除了当我尝试使用ansible playbook而不是简单的ssh命令时,它对该服务器失败了。
任何见解都会受到赞赏。
答案 0 :(得分:22)
我认为错误根本与脚本无关。问题是:当您尝试运行脚本时,您所在的目录不再存在。例如,您有两个终端,第一个终端cd somedir/
,第二个终端mv somedir/ somewhere_else/
,然后尝试在第一个终端运行 - 您将收到此错误消息。
至少这是我的情况。
答案 1 :(得分:3)
根据this answer,当“您重新创建目录”但在此位置已经有一个shell时会发生这种情况,因此我们可以简单地运行:
cd ~ && cd -
答案 2 :(得分:0)
您正在将此作为脚本执行.. $(〜/ .ansible / ansible_hosts)。 $()表示bash将尝试执行该脚本,然后输出结果。
但它不是剧本,对吗?这是一个主机列表!
只需添加单词cat
即可。
#!/bin/bash
for server in $(cat ~/.ansible/ansible_hosts)
do
ssh $server "hostname; readlink /opt/mydir/mylink;"
done
答案 3 :(得分:0)
在为测试用例创建和删除测试文件的unittest
方法中,tearDown
遇到了相同的错误。即使我有想要通过for循环删除的目录的完整路径,也足够奇怪,我必须提供os.chdir(path_where_dirs_at)
才能消除错误。不知道这是否是一个好的解决方案,但是消息消失了。