답변:
기본 이름이 필요하지 않으며 특히 pwd를 실행하는 서브 쉘이 필요하지 않습니다 ( 추가적이고 값 비싼 포크 작업을 추가 함 ). 쉘은 매개 변수 확장을 사용하여 내부적 으로이 작업을 수행 할 수 있습니다 .
result=${PWD##*/} # to assign to a variable
printf '%s\n' "${PWD##*/}" # to print to stdout
# ...more robust than echo for unusual names
# (consider a directory named -e or -n)
printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as shell input
# ...useful to make hidden characters readable.
다른 상황에서 (이 아닌 PWD
디렉토리 이름을 가진 다른 변수) 에이 기술을 적용하는 경우 후행 슬래시를 잘라야 할 수도 있습니다. 아래는 bash의 extglob 지원 을 사용 하여 후행 슬래시가 여러 개인 경우에도 작동합니다.
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
또는 extglob
: 없이
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
$PWD
은 내장 bash 변수의 이름입니다. 모든 내장 변수 이름은 모두 대문자로되어 있습니다 (로컬 변수와 구별하기 위해 항상 소문자가 하나 이상 있어야 함). 평가 result=${PWD#*/}
하지 않습니다/full/path/to/directory
; 대신 첫 번째 요소 만 제거하여 만듭니다 path/to/directory
. 두 #
문자를 사용하면 패턴이 욕심이되어 최대한 많은 문자가 일치합니다. 자세한 내용은 답변에 링크 된 매개 변수 확장 페이지를 읽으십시오.
pwd
값이 항상 값과 같지는 않습니다 . 이것은 자동 마운트 된 디렉토리를 처리 할 때 특히 골치 거리가되는데, 논리적 경로 대신 물리적 경로를 기록하면 사용되는 경우 자동 마운터가 자발적으로 디렉토리를 마운트 해제 할 수있는 경로가 생성됩니다. $PWD
cd
-o physical
sh
및 csh
당신이 전체 읽을 수 있었다 일할 수있는 백 스페이스 키를 원하는 경우 stty
매뉴얼 페이지를, 우리는 그것을 좋아!"
basename
프로그램을 사용하십시오 . 귀하의 경우 :
% basename "$PWD"
bin
basename
프로그램 의 목적이 아닙니까? 따옴표가 누락 된 것 외에이 답변에 어떤 문제가 있습니까?
basename
참으로 올바른 일을 외부 프로그램이지만, 실행 어떤 일이 강타를위한 외부 프로그램은 즉시 사용 할 수있는 유일한 내장 기능이 바보 사용 (성능에 미치는 영향을 초래 fork()
, execve()
, wait()
위해 등) 이유없이.
basename
여기에 대한 나의 반대 의견 은 적용 되지 않습니다 . 따라서 외부 도구로 사용 하면 성능 오버 헤드가 발생하지만이를 보완하는 데 도움이되는 기능도 있습니다. dirname
dirname
${PWD##*/}
.
dirname
function
키워드는 표준화 된 구문에 값을 추가하지 않고 POSIX와 호환되지 않으며 따옴표가 없으면 디렉토리 이름에 공백이있는 버그가 발생합니다. wdexec() { "./$(basename "$PWD")"; }
바람직한 대안이 될 수 있습니다.
basename
것이 덜 "효율적"입니다. 그러나 추악한 bash 구문에 비해 기억하기 쉽기 때문에 개발자 생산성 측면에서 더 효율적일 것입니다 . 기억이 나면 가십시오. 그렇지 않으면 basename
잘 작동합니다. 누군가가 bash 스크립트의 "성능"을 향상시키고 더 효율적으로 만들어야 했습니까?
$ echo "${PWD##*/}"
echo "${PWD##*/}"
.
name=${PWD##*/}
name=$(echo "${PWD##*/}")
pwd와 basename의 조합을 사용할 수 있습니다. 예 :
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
선택한 답변 (Charles Duffy)이 마음에 들지만 심볼릭 디렉토리에 있고 대상 디렉토리의 이름을 원할 경우주의하십시오. 불행히도 단일 매개 변수 확장 식으로 수행 할 수 있다고 생각하지 않습니다. 아마도 실수입니다. 이것은 작동해야합니다 :
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
이것을보기 위해 실험 :
cd foo
ln -s . bar
echo ${PWD##*/}
"바"보고서
경로의 주요 디렉토리를 표시하려면 (/ usr / bin / dirname의 fork-exec가 발생하지 않음) :
echo ${target_PWD%/*}
예를 들어 foo / bar / baz-> foo / bar 변환
readlink -f
GNU 확장은 BSD (OS X 포함)에서 사용할 수 없습니다.
echo "$PWD" | sed 's!.*/!!'
Bourne 쉘을 사용 중이거나 ${PWD##*/}
사용할 수없는 경우
${PWD##*/}
로 POSIX sh입니다. 모든 현대 / bin / sh (대시, 애쉬 등 포함)가이를 지원합니다. 최근 박스에서 실제 Bourne을 누르려면 약간 오래된 Solaris 시스템에 있어야합니다. 그 너머- echo "$PWD"
; 따옴표를 생략하면 버그가 발생합니다 (디렉토리 이름에 공백, 와일드 카드 문자 등이있는 경우).
놀랍게도 아무도 내장 bash 명령 만 사용하는이 대안을 언급하지 않았습니다.
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
AS를 추가 보너스 당신은 쉽게 상위 디렉토리로의 이름을 얻을 수 있습니다 :
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"
이것들은 Bash 4.3-alpha 이상에서 작동합니다.
사용하다:
basename "$PWD"
또는
IFS=/
var=($PWD)
echo ${var[-1]}
IFS (Internal Filename Separator)를 다시 공간으로 돌립니다.
IFS=
IFS 뒤에 공백이 하나 있습니다.
basename $(pwd)
또는
echo "$(basename $(pwd))"
pwd
합니다 basename
. 그대로 전달되기 전에 출력 이 문자열 분할되고 glob-expanded됩니다 .
basename "$(pwd)"
- 그 단지에 비해 매우 비효율적이지만 basename "$PWD"
, 인 자체 매개 변수 확장을 사용하는 대신 호출에 비해 비효율적 basename
전혀.
저처럼 기수 찾기를 위해 :
find $PWD -maxdepth 0 -printf "%f\n"
$PWD
에 "$PWD"
제대로 특이한 디렉토리 이름을 처리 할 수 있습니다.
그냥 사용하십시오 :
pwd | xargs basename
또는
basename "`pwd`"
xargs
디렉토리 이름에 문자 줄 바꿈 문자 또는 인용 부호가 포함되어 있고 두 번째 공식이 pwd
명령을 호출하면 formultion이 비효율적이며 버그가 있습니다. 내장 변수 확장을 통해 동일한 결과를 검색하는 대신 서브 쉘에서.
bash 프롬프트 영역에서 현재 디렉토리 만 보려면 .bashrc
파일을에서 편집 할 수 있습니다 ~
. 변경 \w
에 \W
라인에서 :
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
실행 source ~/.bashrc
하면 프롬프트 영역에 디렉토리 이름 만 표시됩니다.
참조 : /superuser/60555/show-only-current-directory-name-not-full-path-on-bash-prompt
나는 강하게 사용하는 것을 선호합니다 gbasename
GNU coreutils의 일부인을 하는 것이 좋습니다.
basename
됩니다. 일반적으로 gbasename
GNU가 아닌 기본 이름 으로 제공 되는 MacOS 및 기타 플랫폼 에서만 호출 됩니다.
다음 명령은 현재 작업 디렉토리를 bash 스크립트로 인쇄합니다.
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
$1
현재 작업 디렉토리를 포함 할 것인지 확실하지 않습니다 . (2) pushd
와 popd
역 따옴표 안에 아무것도가 서브 쉘에서 수행되기 때문에 여기에 어떤 목적에 봉사하지 - 그것은 시작하는 부모 쉘의 디렉토리에 영향을 미치지 수 있습니다. (3) "$(cd "$1"; pwd)"
공백이있는 디렉토리 이름에 비해 사용하기 가 더 읽기 쉽고 탄력적입니다.