$PWD가 특정 경로의 하위 디렉터리인지 확인하는 방법

$PWD가 특정 경로의 하위 디렉터리인지 확인하는 방법

예를 들어 $PWD/home의 하위 디렉터리인지 확인합니다. 즉, 문자열이 다른 문자열로 시작하는지 확인하기 위해 bash 문자열 작업을 검색하고 있습니다.

답변1

Bourne 스타일 셸에서 문자열이 다른 문자열의 접두사인지 테스트하려면 다음을 수행하세요.

case $PWD/ in
  /home/*) echo "home sweet home";;
  *) echo "away from home";;
esac

접미사 또는 하위 문자열 테스트에도 동일한 원칙이 적용됩니다. case파일 이름과 달리 a 또는 이니셜을 *포함하여 모든 문자가 구성에서 일치합니다 ./.

이 구문을 구현하는 셸 [[ … ]](예: bash, ksh 및 zsh)에서는 문자열을 패턴과 일치시키는 데 사용할 수 있습니다. (이 [명령은 문자열 동일성만 테스트할 수 있습니다.)

if [[ $PWD/ = /home/* ]]; then …

현재 디렉터리가 아래에 있는지 구체적으로 테스트하는 경우 /home심볼릭 링크가 있기 때문에 간단한 하위 문자열 테스트로는 충분하지 않습니다.

/home자체 파일 시스템인 경우 현재 .디렉터리( )가 해당 파일 시스템에 있는지 테스트합니다.

if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
  echo 'The current directory is on the /home filesystem'
fi

NetBSD, OpenBSD, GNU, busybox 또는 toybox(마지막 3개는 Debian, OpenWrt 또는 Android와 같은 Linux 기반 시스템에서 일반적임)가 있는 경우 경로에서 심볼릭 링크 제거를 readlink사용할 수 있습니다 .readlink -f

case $(readlink -f .)/ in "$(readlink -f /home)"/*) …

일부 시스템에는 다음 realpath명령도 있습니다(GNU 도구 상자에도 있으며 이제는 선호됩니다 readlink).

case $(realpath .)/ in "$(realpath /home)"/*) …

셸에는 수정자가 있는 zsh자체 연산자도 있습니다 .realpath():P

if () [[ $1:P/ = $2:P/* ]] . /home; then …

pwd그렇지 않으면 현재 디렉터리 표시를 사용할 수 있습니다 . 그러나 쉘이 cd명령을 추적하고 "실제" 위치가 아닌 디렉토리에 액세스하는 데 사용되는 이름을 유지하는 경우 내장 쉘을 사용하지 않도록 주의해야 합니다 .

case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
  "$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …

답변2

디렉터리가 다른 디렉터리의 하위 디렉터리인지 여부를 안정적으로 테스트하려면 문자열 접두사 확인 이상이 필요합니다. Giles의 답변은 이 테스트를 올바르게 수행하는 방법을 자세히 설명합니다.

그러나 간단한 문자열 접두어 확인을 정말로 원한다면(경로를 정규화했습니까?) 다음이 좋은 대안입니다.

test "${PWD##/home/}" != "${PWD}"

"/home/"으로 시작 하면 $PWD왼쪽에서 제거됩니다. 즉, 오른쪽과 일치하지 않으므로 "!="는 true를 반환합니다.

답변3

대략적인 버전:

[ "${PWD:0:6}" = /home/ ]

단점은 문자 수를 먼저 계산해야 하며 /home/이와 같은 일반적인 것으로 대체 할 수 없다는 것입니다 $1.

편집하다$VAR(@Michael에게 감사드립니다) 사용할 수 있는 것과 비교하기 위해 일반화

[ "${PWD:0:${#VAR}}" = "$VAR" ]

답변4

질문이 잘 이해가 안가는데 부모님이 직접 찾아보셔야 할 것 같아요$PWD, dirname -- "$PWD"하다. 부모의 부모를 찾으려면 dirname -- "$(dirname -- "$PWD")"다음을 실행하십시오.

관련 정보