私はコーダーやプログラマーではありません。ただ学習しようとしていますが、いくつかの制限があります。
セッション(仮想コンソール)にログインするときに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コマンドラインスクリプトの最も悪い部分の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これにより、ユーザーサービスの優れた基盤を提供できます。