Fish Shell:启动脚本问题

Fish Shell:启动脚本问题

我不是编码员或程序员,我只是尝试学习,但我有一些限制......

我想在登录会话(虚拟控制台)时安装 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这可能为用户服务提供良好的基础。

相关内容