我不是编码员或程序员,我只是尝试学习,但我有一些限制......
我想在登录会话(虚拟控制台)时安装 webdav 资源,但是我想检查文件夹是否为空以确定是否必须安装该资源。
这是我试图弄清楚的脚本:
if status is-interactive
# Commands to run in interactive sessions can go here
#
#
# Start WebDav
#
# check if the folder is empty
function tst
command find /mnt/drive -maxdepth 0 -empty
end
# Compare the variable and mount the resource
function drive
set mnt '/mnt/drive'
if test (tst) = $mnt
command rclone mount drive:/ /mnt/drive/ --vfs-cache-mode writes --daemon
else
# Actually I would use a "do nothing"
echo "Resource already mounted"
end
end
drive &
# end WebDav
end
不幸的是它不起作用,登录会话被卡住,因此我必须打开另一个虚拟控制台并收到此错误:
= /mnt/drive
^
~/.config/fish/config.fish (line 12):
if test (tst) = $mnt
^
in function 'drive'
called on line 19 of file ~/.config/fish/config.fish
from sourcing file ~/.config/fish/config.fish
called during startup
Resource already mounted
我不明白我做错了什么......
答案1
在我看来,您似乎遇到了 的问题test
,这是 POSIX 命令行脚本中最糟糕的部分之一,也是一个(无论好坏)复制的脚本。
特别是,if test (tst) = $mnt
如果 的输出tst
为空,则不会按照您的预期运行。
相反,使用:
set mnt '/mnt/drive'
set tst (find /mnt/drive -maxdepth 0 -empty)
if "$tst" = "$mnt"
登录会话中的挂起对我来说表明rclone
没有正确进入后台,或者登录需要很长时间。您可以使用 将其放入后台rclone ... &
,但您可能也想disown
这样做 - 否则当您退出第一个会话时,挂载将被杀死。
然而,外壳可能是执行此操作的错误层。如果您快速连续启动多个 shell,您可能会遇到竞争条件或其他意外行为。根据您的操作系统,systemd 用户服务对我来说听起来是最明智的。有一个 systemd 机器服务配置https://www.jamescoyle.net/how-to/3116-rclone-systemd-startup-mount-script这可能为用户服务提供良好的基础。