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 명령줄 스크립팅의 가장 나쁜 부분 중 하나이며 (좋든 나쁘든) 중복되는 것입니다.

특히, 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이는 사용자 서비스에 대한 좋은 기반을 제공할 수 있습니다.

관련 정보