$ (pwd) 또는 $ PWD를 사용하는 것이 더 낫습니까?


35

나는 BASEDIR=$(pwd)대본에서 만났다 .

덮어 쓸 수있는 BASEDIR="$PWD"것 이외의 를 사용하는 것보다 장점이나 단점이 $PWD있습니까?



@ StéphaneChazelas 매우 흥미로운 글입니다. 나는 반쯤 지나서 계속 될 것이지만, 내가 이해하는 한, 특정 상황에서는 구식이 될 수 $(pwd)있기 때문에 사용하는 것이 좋습니다 $PWD.
Minix

2
bash, dash, zsh 또는 ksh93이 아닌 일부 셸에서만 일부 경우 pwd보다 오래된 정보가 줄어 듭니다 $PWD. $(pwd)반면에 현재 디렉토리가 개행 문자로 끝나는 경우 프로세스가 작동하지 않고 (ksh93 제외) 추가 자원을 사용하는 경우 작동하지 않습니다. 내 견해는의 사용 $PWD이며 $(pwd -P)가치가 없습니다 $(pwd).
Stéphane Chazelas

1
맨 아래에 스테판은 cd -P -- "$dir". $PWD당신 의 가치에 대해 의심이 있다면 항상 cd -P .먼저 할 수 있습니다 . 이것은 또한 $PWD이전에 있던 것을 가져 $OLDPWD와서 나중에 비교할 수 있다는 점에서 유익 할 수 있습니다. 다음 cd ...; cd -순서는 현재 위치로 다시 돌아갈 것입니다.
mikeserv

답변:


41

bash가 발생 $(pwd)하면 pwd 명령을 실행 $(pwd)하고이 명령의 출력으로 바꿉니다. $PWD거의 항상 설정되는 변수입니다. pwd는 오래 전부터 내장 쉘 명령입니다.

그래서 $PWD이 변수가 설정되지 않은 경우 실패하고 $(pwd)당신이 지원하지 않는 쉘 사용하는 경우 실패합니다 $()꽤 자주 내 경험의 경우 구조를. 그래서 사용 $PWD합니다.

모든 괴상한 것처럼 나는 나 자신의 쉘 스크립팅 튜토리얼을 가지고있다.


6
나는 `command`구문이 바람직하지 않으며 $(command)선호되어야 한다는 인상을 받았다 . 내가 아는 한 POSIX와 호환되지만 100 % 확실하지는 않습니다.
Minix

6
@Minix $()실제로 POSIX에 의해 지정되었으므로 /bin/shSolaris 10 및 이전 및 csh파생 셸에서 사용 가능한 사전 POSIX 외부에서는 다른 많은 주류 셸에 해당 기능이 없습니다.
jlliagre

@Minix : 여기에 대신 역 따옴표를 사용하여 하나의 문제를 보여이 사이트에 최근 질문$()
오후 2Ring

올바른 대신 $ ()는 역 따옴표를 사용할 수 있지만 나는 그것을 언급하지 않았다, 그래서이 캐스케이드되지 않습니다의
토르스텐 Staerk

1
튜토리얼에 대한 멋진 미니 맵 ....
kbtzr

6

$PWD성능 때문에 바람직한 것으로 언급되어야한다 . 쉘 변수로서 거의 즉시 해결 될 수 있습니다. $(pwd)좀 더 혼란 스럽습니다. man 1 bulitinBash를 사용하여 시스템 을 검사 하면 pwd명령이 내장 명령이므로 변수에 액세스하는 것만 큼 빠르다고 믿을 수 있습니다. 그러나 $()구문은 내용에 관계없이 항상 새로운 서브 쉘 (새 프로세스)을 시작하여 내용을 실행합니다. 백틱에 대해서도 마찬가지입니다. 실제로, 그것을 벤치마킹 할 때 :

echo 'Benchmarking $(pwd)...'
time (for i in {1..1000}; do echo $(pwd) > /dev/null; done)
echo 'Benchmarking $PWD...'
time (for i in {1..1000}; do echo $PWD > /dev/null; done)

$(pwd)통화의 경우 1.52 초 ,의 경우 0.018 초가 표시됩니다 $PWD. 가능하면 서브 쉘과 불필요한 프로세스를 불필요하게 시작하지 않아야합니다. 다른 언어로 익숙한 함수 호출보다 훨씬 비쌉니다.


그것은 흥미로운 일이지만 쉘 스크립트의 성능에 관심이 있는지는 모르겠습니다. 또한 pwd가 쿼리간에 변경되는 경우 성능이 어떻게 변경되는지 궁금합니다.
Minix

@Minix 루프 본문이 echo $PWD; pushd ..; echo $PWD; popd( >/dev/null각 문장 뒤에 추가로) 포함 되도록 스크립트를 수정했으며 0.05 초가 걸립니다. 그런 다음 echo 문 (push / popd 만)을 제거하고 0.03이 걸렸습니다. 따라서 시간 echo $PWD은 여전히 ​​0.01 초 정도였습니다. 와 비슷한 작업을 수행 $(pwd)했으며 각 루프마다 2.2 초가 걸렸으므로 $(pwd)호출 당 1.1 초가 걸렸습니다 .
markasoftware

너무 까다로울 필요는 없지만 대체 계산 $PWD은 에코 문을 평가하기 전에 백그라운드에서 수행 된다고 상상할 수 있습니다 . 그러나 액세스 $PWD가 여전히 훨씬 빠르기 때문에 호환성이 중요하지 않은 경우에는 서로를 선택해야합니다. 이를 철저히 테스트 한 작업에 감사드립니다. :)
Minix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.