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는 오류도 표시하므로 에코 오류 메시지는 중복 될 수 있습니다.