为何bash中~/.config等被识别为目录?脚本判断异常咨询
你的脚本问题与bash文件类型判断解析
首先,咱们先理清第一个疑问:为什么执行./script01.sh ~/.config会进入第二个分支?这完全是正常行为——因为~/.config本身就是一个目录(这是类Unix系统里约定俗成的用户配置文件存放目录)。而你提到的~/.bashrc其实是个普通文件,不是目录,如果你用它作为参数执行脚本,会触发第一个-f的分支,这点别混淆啦。
接下来详细说bash里-f和-d的判定规则,这是shell脚本处理文件的基础知识点:
-f <路径>:只有当指定路径指向的是一个普通文件(排除目录、符号链接、设备文件、管道这类特殊文件),并且该文件确实存在时,这个测试才会返回“真”(也就是退出码0)。举个例子,~/.bashrc就会满足-f的条件。-d <路径>:当指定路径指向的是一个目录(包括符号链接指向的目录,因为bash会自动解引用符号链接),并且该目录存在时,测试返回“真”。比如~/.config、/home这类路径都会触发这个条件。
回到你的脚本代码:
if [[ -f $first_arg ]]; then open_file $first_arg elif [[ -d $first_arg ]]; then search_directory $first_arg .....
当你传入~/.config时,bash会先把~展开成当前用户的家目录(比如/home/你的用户名/.config),然后进行条件判断:首先检查它是不是普通文件?显然不是,所以跳过第一个分支;接着检查是不是目录?是的,所以进入search_directory的逻辑,这完全符合预期。
如果你的脚本遇到了其他异常情况(比如明明是普通文件却进入了目录分支),那可能是参数传递时的路径展开问题,或者目标路径是符号链接指向了目录,但这种情况也是符合-d的判定规则的。
内容的提问来源于stack exchange,提问作者Saeko
相关产品推荐
相关产品推荐

