我有一个简单的脚本:
#!/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 命令时,该服务器会失败。
任何见解将不胜感激。
该错误很可能与脚本根本无关。问题是:当您尝试运行脚本时所在的目录不再存在。例如,您有两个终端,第一个终端为
cd somedir/
,第二个终端为 mv somedir/ somewhere_else/
,然后尝试在第一个终端中运行任何内容 - 您将收到此错误消息。
请注意,即使您重新创建同名目录,您也会收到此错误,因为新目录将具有不同的 inode 索引。
在 Mac 上,只需终止并重新启动终端即可。它会做对的。
根据这个答案,当“您重新创建目录”但该位置已经有一个shell时,就会发生这种情况,所以我们可以简单地运行:
cd ~ && cd -
注意:如果您使用 zsh 并最终处于这种状态,您可能会在提示符开头看到一个锁定图标 🔒(这通常表明您没有写入权限)。
在 mac 终端上打开一个新选项卡对我有用。
我在为测试用例创建和删除测试文件的
unittest
方法中的tearDown
中也遇到了同样的错误。奇怪的是,即使我有要通过 for 循环删除的目录的完整路径,我也必须先提供 os.chdir(path_where_dirs_at)
才能消除错误。不知道这是否是一个好的解决方案,但消息消失了。
您正在将其作为脚本执行.. $(~/.ansible/ansible_hosts)。 $() 意味着 bash 将尝试执行该脚本,然后输出结果。
但这不是剧本,对吧?这是主机列表!
只需添加单词
cat
就可以了。
#!/bin/bash
for server in $(cat ~/.ansible/ansible_hosts)
do
ssh $server "hostname; readlink /opt/mydir/mylink;"
done
不会丢失 Colab 实例中的变量,
使用 os 库更改目录。
import os
path = "/content" # /content is pretty much the root. you can choose other path in your colab workspace
os.chdir(path)
此解决方案有效,不需要重新启动运行时(并丢失所有数据)。
也许是因为第一行“#!/bin/bash”。 尝试其他的,例如:#!/bin/ksh