현재 디렉터리를 기준으로 모든 상위 디렉터리를 반복적으로 표시합니다.

현재 디렉터리를 기준으로 모든 상위 디렉터리를 반복적으로 표시합니다.

현재 디렉터리를 기준으로 모든 상위 디렉터리를 반복적으로 표시합니다.

#!/bin/bash
IFS=/
for var in $(pwd)
do
echo "$var"
done

답변1

다음을 수행할 수 있습니다.

(
  while
    [ "$PWD" != / ] && cd -P ..
  do
    pwd
  done
)

그러나 이 코드가 무한 루프에서 실행될 수 있는 병리학적 상황이 하나 이상 있습니다. 즉, 현재 디렉터리가 삭제된 경우입니다. 이 경우 GNU/Linux와 적어도 bash-5.0에서는 bash가 대화형이 아닐 때 cd -P ..오류가 인쇄되지만 실패한 종료 상태가 반환되지 않는 것을 발견했습니다. 그런 다음 아무것도 하지 않게 $PWD됩니다 . 이 문제를 해결 하려면 루프 종료 조건을 변경하십시오 ..cd -P ..[ "$PWD" != / ] && [ "$PWD" != . ] && cd -P ..

귀하의 접근 방식에 대한 몇 가지 의견은 다음과 같습니다.

  • $(pwd)pwd후행 개행 문자를 뺀 출력을 확장하므로 현재 디렉터리가 개행 문자로 끝나는 경우 올바르게 작동하지 않습니다.
  • POSIX 쉘에서는 $PWD현재 작업 디렉토리의 경로가 저장되고 이것이 pwd인쇄됩니다. 그러나 저장된 경로 와 출력에는 cd옵션을 사용하지 않는 한 심볼릭 링크 구성 요소가 포함될 수 있습니다 . 심볼릭 링크이고 파일이 심볼릭 링크 인 경우 상위 디렉터리는 가 아닐 수 있습니다 .-P$PWDpwd$PWD/foo/bar/baz/foo/bar
  • 에서 , Split+glob은 bash목록 컨텍스트(예: 이 루프 문의 부분)에서 따옴표(또는 ) 없이 $(pwd)호출됩니다 . 로 설정하여 분할 섹션을 구성했지만 전역 섹션을 비활성화하는 것을 잊었습니다(사용). 이름이 지정된 디렉터리인 경우 해당 디렉터리는 "", "tmp" 및 현재 디렉터리에 숨겨져 있지 않은 모든 파일로 분할+글로브됩니다.$PWDinfor$IFS/set -o noglob$PWD/tmp/*
  • echo임의의 데이터를 출력하는 데 사용할 수 없습니다. 이 방법은 bash일반적으로 이름이 지정된 디렉터리에 구축 및 구성되며 아무 것도 출력 /tmp/-Ene하지 않습니다 echo -Ene. 뒤에 개행 문자가 오는 것을 출력하려면 대신 를 사용하십시오 printf '%s\n' "$var".
  • $PWDa 의 구성 요소 중 어느 것도 심볼릭 링크가 아니고 현재 디렉토리의 조상이 아닌 , 및 의 구성 요소가 없는 직접적인 경우에도 /path/to/dir코드는 빈 줄을 출력합니다 .pathtodir//path/path/to

관련 정보