현재 디렉터리를 기준으로 모든 상위 디렉터리를 반복적으로 표시합니다.
#!/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
$PWD
pwd
$PWD
/foo/bar/baz
/foo/bar
- 에서 , Split+glob은
bash
목록 컨텍스트(예: 이 루프 문의 부분)에서 따옴표(또는 ) 없이$(pwd)
호출됩니다 . 로 설정하여 분할 섹션을 구성했지만 전역 섹션을 비활성화하는 것을 잊었습니다(사용). 이름이 지정된 디렉터리인 경우 해당 디렉터리는 "", "tmp" 및 현재 디렉터리에 숨겨져 있지 않은 모든 파일로 분할+글로브됩니다.$PWD
in
for
$IFS
/
set -o noglob
$PWD
/tmp/*
echo
임의의 데이터를 출력하는 데 사용할 수 없습니다. 이 방법은bash
일반적으로 이름이 지정된 디렉터리에 구축 및 구성되며 아무 것도 출력/tmp/-Ene
하지 않습니다echo -Ene
. 뒤에 개행 문자가 오는 것을 출력하려면 대신 를 사용하십시오printf '%s\n' "$var"
.$PWD
a 의 구성 요소 중 어느 것도 심볼릭 링크가 아니고 현재 디렉토리의 조상이 아닌 , 및 의 구성 요소가 없는 직접적인 경우에도/path/to/dir
코드는 빈 줄을 출력합니다 .path
to
dir
/
/path
/path/to