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

私の考えでは、あなたが経験している問題は、testPOSIXコマンドラインスクリプトの最も悪い部分の1つであり(良いか悪い)、重複することです。

特に、if test (tst) = $mnt出力がtst空の場合、期待どおりに動作しません。

代わりに、以下を使用してください。

set mnt '/mnt/drive'
set tst (find /mnt/drive -maxdepth 0 -empty)
if "$tst" = "$mnt"

ログインセッションが中断されると、rcloneバックグラウンドに正しく入らないか、ログインに時間がかかります。を使用してバックグラウンドに配置できますが、そうしたい場合がrclone ... &ありますdisown。それ以外の場合は、最初のセッションを終了するとマウントが終了します。

ただし、シェルはこれを実行するのに間違ったレイヤーになる可能性があります。複数のシェルをすばやく連続して実行すると、競合状態やその他の予期しない動作が発生する可能性があります。オペレーティングシステムによっては、systemdユーザーサービスが最も合理的に聞こえます。システム化された機械サービス構成があります。https://www.jamescoyle.net/how-to/3116-rclone-systemd-startup-mount-scriptこれにより、ユーザーサービスの優れた基盤を提供できます。

関連情報