7.2 文件测试操作

    检测文件是否存在

    -a

    检测文件是否存在

    等价于 -e。不推荐使用,已被弃用[^1]。

    -f

    文件是常规文件(regular file),而非目录或 设备文件

    -s

    文件大小不为0

    -d

    文件是一个目录

    -b

    文件是一个 块设备

    -c

    文件是一个 字符设备

    -p

    文件是一个 管道设备

    1. function show_input_type()
    2. {
    3. [ -p /dev/fd/0 ] && echo PIPE || echo STDIN
    4. }
    5. show_input_type "Input" # STDIN
    6. # 这个例子由 Carl Anderson 提供。

    文件是一个

    -L

    文件是一个符号链接

    -S

    -t

    文件()与终端设备关联

    该选项通常被用于 测试 脚本中的 stdin [ -t 0 ]stdout [ -t 1 ] 是否为终端设备。

    -r

    该文件对执行测试的用户可读

    -w

    该文件对执行测试的用户可写

    -x

    该文件可被执行测试的用户所执行

    -g

    文件或目录设置了 set-group-id sgid 标志

    如果一个目录设置了 sgid 标志,那么在该目录中所有的新建文件的权限组都归属于该目录的权限组,而非文件创建者的权限组。该标志对共享文件夹很有用。

    文件设置了 set-user-id suid 标志。

    一个属于 root 的可执行文件设置了 标志后,即使是一个普通用户执行也拥有 root 权限[^2]。对需要访问硬件设备的可执行文件(例如 pppdcdrecord)很有用。如果没有 suid 标志,这些可执行文件就不能被非 root 用户所调用了。

    设置了 suid 标志后,在权限中会显示 s

    -k

    设置了粘滞位(sticky bit)。

    1. drwxrwxrwt 7 root 1024 May 19 21:26 tmp/

    如果一个用户不是设置了粘滞位目录的拥有者,但对该目录有写权限,那么他仅仅可以删除目录中他所拥有的文件。这可以防止用户不经意间删除或修改其他人的文件,例如 文件夹。(当然目录的所有者可以删除或修改该目录下的所有文件)

    -O

    执行用户是文件的拥有者

    -G

    文件的组与执行用户的组相同

    -N

    文件在在上次访问后被修改过了

    f1 -nt f2

    文件 f1 比文件 f2 新

    f1 -ot f2

    文件 f1 比文件 f2 旧

    f1 -ef f2

    文件 f1 和文件 f2 硬链接到同一个文件

    取反——对测试结果取反(如果条件缺失则返回真)。

    样例 7-4. 检测链接是否损坏

    样例 31-1,,样例 11-3,和样例 A-1 也包含了文件测试操作符的使用。

    [^1]: 摘自1913年版本的韦氏词典


      [^2]: 注意使用 suid 的可执行文件可能会带来安全问题。suid 标记对 shell 脚本没有影响。
      [^3]: 在 Linux 系统中,文件已经不使用粘滞位了, 粘滞位只作用于目录。