如何在Bash中测试文件或符号链接的存在,甚至是损坏的文件或符号链接?
在Bash中,我想说,“如果存在如何在Bash中测试文件或符号链接的存在,甚至是损坏的文件或符号链接?,bash,Bash,在Bash中,我想说,“如果存在~/.gitconfig,那么做一些事情”,但是很难找到正确的条件。我需要解释普通文件、有效符号链接和断开的符号链接 我尝试过但不起作用的事情: if[[-L“$HOME/.gitconfig”]–当.gitconfig是普通文件时,返回false if[[-e“$HOME/.gitconfig”]-当.gitconfig存在但符号链接已断开时,返回false 是否有一个开关可以做我想要的,或者我需要提出一个更复杂的条件 更新:我删除了删除文件的内容,我只对条
~/.gitconfig
,那么做一些事情”,但是很难找到正确的条件。我需要解释普通文件、有效符号链接和断开的符号链接
我尝试过但不起作用的事情:
–当if[[-L“$HOME/.gitconfig”]
是普通文件时,返回false.gitconfig
-当if[[-e“$HOME/.gitconfig”]
存在但符号链接已断开时,返回false.gitconfig
更新:我删除了删除文件的内容,我只对条件感兴趣,而不是之后发生的操作。此条件满足我的需要(尽管如果存在,我仍然希望使用单个开关/测试):
file=“$HOME/.gitconfig”
如果[-e$file | |-L$file]];然后
echo“文件存在”
fi
此条件满足我的需要(尽管如果存在,我仍然希望使用单个开关/测试):
file=“$HOME/.gitconfig”
如果[-e$file | |-L$file]];然后
echo“文件存在”
fi
我通常使用-s,因为在操作文件列表时,我会将列表发送到一个文件中,并使用ed重复从文件中拉出第一行。只有当文件长度不为零时,-s开关才为真,这意味着一旦我删除了每一行,循环就会停止。我通常使用-s,因为在处理文件列表时,我会将列表发送到一个文件中,并使用ed反复从文件中拉出第一行。只有当文件长度不为零时,-s开关才为真,这意味着一旦我删除了每一行,循环就会停止。也许您正在寻找的是readlink
$ readlink /tmp/link; echo $?
below cmd output started 2020 Fri Mar 27 08:00:38 AM PDT
/tmp/notthere
0
above cmd output done 2020 Fri Mar 27 08:00:38 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291
$ readlink /etc/passwd; echo $?
below cmd output started 2020 Fri Mar 27 08:00:46 AM PDT
1
above cmd output done 2020 Fri Mar 27 08:00:46 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291
$ readlink /tmp/nonexistent; echo $?
below cmd output started 2020 Fri Mar 27 08:00:56 AM PDT
1
HTH也许您正在寻找的是readlink
$ readlink /tmp/link; echo $?
below cmd output started 2020 Fri Mar 27 08:00:38 AM PDT
/tmp/notthere
0
above cmd output done 2020 Fri Mar 27 08:00:38 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291
$ readlink /etc/passwd; echo $?
below cmd output started 2020 Fri Mar 27 08:00:46 AM PDT
1
above cmd output done 2020 Fri Mar 27 08:00:46 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291
$ readlink /tmp/nonexistent; echo $?
below cmd output started 2020 Fri Mar 27 08:00:56 AM PDT
1
HTH
if[-L“$HOME/.gitconfig”&&!-e“$HOME/.gitconfig”];然后echo“$HOME/.gitconfig”是一个悬挂的符号链接;fi
@chepner我删除了关于删除文件的提及,我实际上需要在IF块中做更复杂的事情,对此表示抱歉。IF[[-L“$HOME/.gitconfig”&&!-e“$HOME/.gitconfig”];然后echo“$HOME/.gitconfig”是一个悬挂的符号链接”;fi
@chepner我删除了删除文件的内容,我实际上需要在IF块中执行更复杂的操作,对此表示抱歉。您应该拆分并反转条件:IF test-L“$file”| test-e“$file”
<代码>测试不会在第一次匹配时中止,而是评估每个条件。在stat()
之前执行lstat()
(-L
)可能更方便选择…您应该拆分并反转条件:如果test-L“$file”| test-e“$file”
<代码>测试不会在第一次匹配时中止,而是评估每个条件。在stat()
之前执行lstat()
(-L
)可能更方便选择。。。