Bash 스크립트에 볼륨이 마운트되어 있는지 확인하는 가장 좋은 방법은 무엇입니까? 가장 좋은 방법은 무엇입니까? 내가 정말로 원하는

Bash 스크립트에 볼륨이 마운트되어 있는지 확인하는 가장 좋은 방법은 무엇입니까?

내가 정말로 원하는 것은 다음과 같이 사용할 수있는 방법입니다.

if <something is mounted at /mnt/foo>
then
   <Do some stuff>
else
   <Do some different stuff>
fi


답변

/etc/mtab일치하지 않을 수 있으므로 사용하지 마십시오 .

배관 mount이 그렇게 복잡 할 필요는 없으므로 피하십시오 .

간단히:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(뒤의 공백 /mnt/foo은 예를 들어 일치를 피하는 것 /mnt/foo-bar입니다.)


답변

if mountpoint -q /mnt/foo
then
   echo "mounted"
else
   echo "not mounted"
fi

또는

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"

답변

findmnt -rno SOURCE,TARGET "$1"다른 답변의 모든 문제를 피하십시오. 단 하나의 명령으로 작업을 깔끔하게 수행합니다.


다른 접근 방식에는 다음과 같은 단점이 있습니다.

  • grep -q그리고 grep -s여분의 불필요한 단계이며, 모든 곳에서 지원되지 않습니다.
  • /proc/\* 모든 곳에서 지원되지는 않습니다.
  • mountinfo / proc /.를 기반으로합니다.
  • cut -f3 -d' ' 경로 이름에서 공백을 엉망으로 만듭니다
  • 마운트 의 공백을 구문 분석하는 데 문제가 있습니다. 맨 페이지는 이제 말합니다 :

.. 리스팅 모드는 이전 버전과의 호환성을 위해서만 유지됩니다.

보다 강력하고 사용자 정의 가능한 출력을 얻으 려면 특히 스크립트에서 findmnt (8)를 사용 하십시오.


배쉬 기능 :

#These functions return exit codes: 0 = found, 1 = not found

isMounted    () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE        "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno        TARGET "$1" >/dev/null;} #path   only

#where: -r = --raw, -n = --noheadings, -o = --output

사용 예 :

if isPathMounted "/mnt/foo bar";      #Spaces in path names are ok.
   then echo "path is mounted"
   else echo "path is not mounted"
fi

if isDevMounted "/dev/sdb4";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

#Universal:
if isMounted "/mnt/foo bar";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isMounted "/dev/sdb4";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

답변

이와 같은 스크립트는 이식성이 없습니다. 유닉스의 더러운 비밀은 커널 만이 파일 시스템의 위치를 ​​알고 있으며 / proc (휴대용 아님)과 같은 짧은 것은 결코 대답하지 않을 것입니다.

나는 일반적으로 df를 사용하여 서브 디렉토리의 마운트 지점과 파일 시스템이 무엇인지 발견합니다.

예를 들어 (재 / AT & T ksh / bash와 같은 posix 쉘 필요)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

킨다는 유용한 정보를 알려줍니다.


답변

다음은 내 rsync 백업 cron-job 중 하나에서 사용하는 것입니다. / backup이 마운트되어 있는지 확인하고 마운트되어 있지 않으면 마운트를 시도합니다 (드라이브가 핫 스왑 베이에 있고 시스템에 없을 수도 있으므로 실패 할 수 있음)

참고 : 다음은 Linux에서만 작동합니다. / proc / mounts를 greps하기 때문에보다 이식성있는 버전은 ‘mount | grep / backup ‘, Matthew의 답변 에서처럼 ..

  만약 ! grep -q / backup / proc / mounts; 그때
    만약 ! 마운트 / 백업; 그때
      에코 "실패"
      1 번 출구
    fi
  fi
  에코 "성공했습니다."
  # 여기에 물건을

답변

마운트하려면 어쨌든 디렉토리가 있어야합니다. 마운트 된 디렉토리는 항상 사용되지 않는 이상한 파일 이름으로 가짜 파일을 작성하고 존재 여부를 확인하는 것이 었습니다. 파일이 있으면 해당 지점에 마운트 된 것이 없습니다 …

나는 이것이 네트워크 드라이브 또는 이와 유사한 것을 마운트하는 데 효과가 없다고 생각합니다. 플래시 드라이브에 사용했습니다.


답변

장치 번호를 비교하는 것은 어떻습니까? 난 그냥 대부분의 생각하려고했다 밀교 방법 ..

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

내 논리에 결함이 있습니다 …

기능으로서 :

#!/usr/bin/bash
function somethingMounted {
        mountpoint="$1"
        if ! device1=$(stat -c "%d" $mountpoint); then
                echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi
        if ! device2=$(stat -c "%d" $mountpoint/..); then
                echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi

        if [[ $device1 -ne $device2 ]]; then
                #echo "Somethin mounted there I reckon"
                return 0
        else
                #echo "Nothin mounted it seems"
                return 1
        fi
}

if somethingMounted /tmp; then
        echo "Yup"
fi

stat는 오류도 표시하므로 에코 오류 메시지는 중복 될 수 있습니다.