/etc/mtab
심볼릭 링크가 가리키는 지 테스트해야 합니다 . POSIX 표준을 준수해야 합니다. (일반적으로 RHEL 5에서 RHEL 7까지 실행해야 합니다.) 현재 내가 가지고 있는 것은 다음과 같습니다./proc/something
#!/bin/bash
if [ $(readlink -f /etc/mtab | grep '\/proc\/') ]; then
echo do something related to proc
else
echo do something other than proc
fi
일부 극단적인 경우를 놓쳤나요?
답변1
- 심볼릭 링크 라면
/etc/mtab
어떨까요/home/mikasa/proc/something
? 아마도^
grep 정규 표현식에 a를 추가해야 할 것입니다. - 말하자면,
/
정규 표현식에는 특수 문자가 없으므로 이스케이프할 필요가 없습니다. - 그렇게 하지 않을 타당한 이유가 없고 자신이 무엇을 하고 있는지 확실히 알고 있지 않는 한 쉘 변수 참조를 인용해야 합니다. 여기에는
$(…)
명령 대체가 포함됩니다./etc/mtab
심볼릭 링크가 있고/proc/foo = bar
명령이 다음으로 확장되는 매우 심각한 상황의 경우if [ /proc/foo = 열 ]
물론 거짓으로 평가됩니다. 큰따옴표 로 묶어서$(…)
이 문제를 해결할 수 있습니다.만약에 ["$(readlink -f /etc/mtab | grep '^/proc/')"];그 다음에
test
그러나 명령 대체 또는 (일명[
... ) 을 수행할 필요는 없습니다]
.grep
찾으라고 지시한 패턴을 찾았는지 여부를 나타내는 종료 상태를 제공하므로 다음과 같이 명령을 단순화할 수 있어야 합니다.readlink -f /etc/mtab | grep '^/proc/' > /dev/null;
답변2
readlink -f
POSIX는 아니지만 코드가 원하는 대로 작동하는 것 같습니다.
POSIX가 아닌 또 다른 좋은 솔루션은 다음과 같습니다.
if [ "$(df --output=fstype /etc/mtab | tail -n +2)" = "proc" ]; then
(proc 파일 시스템이 /proc에 마운트되지 않은 경우에도 작동합니다)
하지만 현실 세계에서는 간단히 확인하는 것만으로도 충분할 수도 있습니다.
if [ -L /etc/mtab ]; then
마지막 것은 util-linux 테스트 스위트에서도 사용되었으며 지금까지 버그 보고서를 받지 못했습니다. 기존 Linux 배포판에서 /etc/mtab은 일반 파일이거나 /proc/self/mounts에 대한 심볼릭 링크인 것 같습니다.