今天我在我们的一台测试服务器上发现了一些非常有趣的东西(至少对我来说):
我可以使用相对路径从我的实际工作目录更改到现有目录,但是使用时不会列出该目录ls -a
。
这里是 shell 会话(如root
):
$ pwd
/you/are/here
$ ls -a
. .. <-- Note: "somedir" is not shown to root
$ echo $CDPATH
$ cd somedir <-- But still: "cd" works fine
$ pwd
/you/are/here/somedir
$ cd ..
$ pwd
/you/are/here
$ ls -a
. ..
有人能告诉我,这怎么可能?我已经检查过了:ls
是来自/bin/ls
, 是pwd
,/bin/pwd
都来自其原始包装(我的意思是:没有被黑客入侵)。
/you
是已安装的 EMC 磁盘(ext3)。并且somedir
存在,我可以列出它的内容(有几个子目录、文件)。它的名称不是以点开头的。
更多 shell 会话,包含有关命令和ls
输出的更多信息:
root@U-TEST@AT$/bin/ls -ali
total 4
16515074 drwxrwxr-x 2 U8000966 test 2048 Sep 1 07:39 .
16515073 drwxrwxr-x 3 U8000966 test 2048 Apr 27 2006 ..
root@U-TEST@AT$ls -ali somewhere | head -5
total 182
16515075 drwxrwxr-x 43 U8000966 test 2048 Sep 1 07:39 .
16515074 drwxrwxr-x 2 U8000966 test 2048 Sep 1 07:39 ..
16519169 drwxrwxrwx 4 U8000966 test 2048 Jul 25 2007 AAA
16515124 drwxrwxr-x 3 U8000966 test 2048 May 12 2006 BBB
root@U-TEST@AT$type ls
ls is aliased to `/bin/ls $LS_OPTIONS'
root@U-TEST@AT$type pwd
pwd is a shell builtin
root@U-TEST@AT$/bin/pwd
/you/are/here
root@U-TEST@AT$cd somewhere
root@U-TEST@AT$/bin/pwd
/you/are/here/somewhere
root@U-TEST@AT$type cd
cd is a shell builtin
请注意共 4在第一个之后ls -ali
。(我不知道这是否相关......)
更多测试:
root@UR-TEST@AT$ls
. ..
root@U-TEST@AT$touch somewhere/testfile
root@U-TEST@AT$ls
. ..
root@U-TEST@AT$cp somewhere/testfile ./
root@U-TEST@AT$ls
. .. testfile
root@U-TEST@AT$du .
2 .
root@URBIS-TEST@AT$
EMC 是:http://www.emc.com/products/family/disk-library-family.htm,但在这种情况下他们只是一个磁盘提供商,拥有硬盘,格式为 ext3。
更新
(抱歉,昨天我不得不离开)
我确实检查了echo *
,它的输出是:. ..
。以下是LS_OPTIONS
:-a -N --color=tty -T 0
。
我检查了 Gilles 提到的自动挂载功能,但当我更改为somewhere
并发布时,mount|grep somewhere
没有任何输出。
以下是建议的输出lsattr
:strace
http://gist.github.com/566947
答案1
Zsolt,请尝试以下三个步骤:
-
1.
cd /
2.
exec bash
3.
/usr/bin/find /you/are/here -ls
也许是时候fsck
... :-(
但在此之前,您可以尝试(备份里面的所有内容之后somedir
):
cd /you/are/here && mkdir somedir
.
cd /you/are/here && ln somedir newdir
(以 root 身份)。
还要检查mount | egrep -e 'somedir|you|are|here'
是否有任何异常。
答案2
在我写这篇文章的时候,你还没有排除 中的某些影响$LS_OPTIONS
。GNU ls 有一些文件忽略选项,但ls -I foo -a
仍然会忽略foo
。但我的其余回答假设你在没有 的情况下也能得到相同的结果$LS_OPTIONS
。
事实上,这一行并不令人惊讶。这是和total 4
使用的块总数。如果为空且较小,并且文件系统的块大小等于 4 个 ls 块(这很常见:GNU ls 默认为 1kB 块,而 ext[234] 通常使用 4kB 块),则预期总数为 0 + 1 * 4 = 4。.
..
.
..
当前文件系统发生了一些不寻常但并非闻所未闻的事情。当您请求(带有和)/you/are/here
的内容时,文件系统仅响应和;然而,当您假设存在时,系统会告诉您它确实存在。这是令人惊讶但可能的行为。/you/are/here
opendir()
readdir(3)
.
..
/you/are/here/somedir
一个可能但可能性极小的解释是恶魔(如麦克斯韦妖,而不是守护程序) 仅在您访问目录时移动somedir
到位,并在您列出目录时将其移开。因此,您观察到的异常可能是由普通程序恰好做出正确猜测引起的,并不表示操作系统存在任何问题。
事实上,操作系统可能是行为方式很奇怪。常见的罪魁祸首是自动挂载系统。自动挂载系统的工作方式通常如下:
目录,例如
/you/are/here
,被设置为挂载点的位置。专用文件系统(可能称为autofs
)被挂载在那里。当您尝试访问 中的条目
/you/are/here
(例如 )时/you/are/here/somedir
,文件系统驱动程序会尝试挂载文件系统。例如,它可能会在其配置文件中查找类似或somedir
的行,并将指示的设备或 NFS 位置挂载为。somedir = /dev/foo
somedir = server:/loca/tion
/you/are/here/somedir
当您列出目录时
/you/are/here
,您会看到当前已挂载的每个文件系统的子目录。当您停止使用 时
/you/are/here/somedir
,也许经过一段时间后,自动挂载程序会卸载somedir
。因此,somedir
不再出现在 的列表中/you/are/here
。
答案3
“which ls” 或 “alias” 显示什么?也许你的ls
命令被别名或类似的东西覆盖了?运行以下命令可能会排除这种情况:
/bin/ls -a /you/are/here
背景信息:
别名优先于/bin/ls
,但which ls
仍显示/bin/ls
。您可以通过以下方式重新创建我所指的内容:
创建一个名为的 bash 脚本
ls
,并保存:#!/bin/bash echo this is not ls
为 bash 脚本创建别名:
别名 ls='~/ls'
现在,运行
ls
。您应该得到“this is not ls”,但which ls
显示/bin/ls
。
排除 autofs/automount 可能也会有益。
查看已发布的更新后...
也许 LS_OPTIONS 包含 --hide 或 --ignore?
~/dirtest$ ls -a
. .. somewhere
~/dirtest$ ls -a --ignore='some*'
. ..
... 是什么意思?
echo $LS_OPTIONS
...展示?或许甚至可以尝试...
unset LS_OPTIONS
...然后重新运行 ls -a。
可能是 LS_OPTIONS 正在您的 .bashrc 或其他配置文件中设置。(甚至可能是在全局级别,来自 /etc/bash*(或任何适合相关 shell 的配置文件:.login、.profile 等))
答案4
以下内容可能有帮助,也可能没有帮助,但我想看看以下两个命令的输出:
$ lsattr -av somedir
$ strace ls -a somedir