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

스크립트에서 BASEDIR=$(pwd)를 발견했습니다.

장점 또는 단점이 있습니까? $PWD를 덮어 쓸 수있는 것 외에 BASEDIR="$PWD"를 사용 하시겠습니까?

댓글

  • unix.stackexchange.com/a/79621 의 일부 정보
  • @St é phaneChazelas 매우 흥미로운 글입니다. 저는 ' 중반 정도에 불과하며 계속할 것입니다.하지만 이해하는 한 '는 $(pwd). $PWD는 특정 상황에서 구식이 될 수 있기 때문입니다.
  • 일부 셸에서만 가능합니다 (bash, dash, zsh 또는 ksh93 제외). 예) pwd는 일부 코너 케이스에서 잠재적으로 $PWD보다 오래된 정보를 덜 제공합니다. 반면에 $(pwd)는 현재 디렉토리가 개행 문자로 끝나는 경우 작동하지 않습니다. 즉, 프로세스를 분기 (ksh93 제외)하고 추가 자원을 사용하십시오. 내 견해는 $(pwd -P)$PWD를 사용하고 있습니다. '는

    .

  • 하단에 cd -P -- "$dir"를 사용하여 스테판이 언급되어 있습니다. $PWD의 값이 의심 스러우면 항상 먼저 cd -P . 할 수 있습니다. 또한 $OLDPWD에서 이전에 있던 $PWD를 가져와 나중에 비교할 수 있다는 점에서 유용 할 수 있습니다. div id = “3304cd57f5″>

시퀀스를 사용하면 현재 위치로 돌아갈 수 있습니다.

답변

bash가 $(pwd)를 만나면 pwd 명령을 실행하고 $(pwd)를이 명령의 출력으로 바꿉니다. $PWD는 거의 항상 설정되는 변수입니다. pwd는 오랫동안 내장 된 쉘 명령입니다.

그래서 $PWD 이 변수를 설정하지 않으면 실패하고 $(pwd)$() 구성을 지원하지 않는 셸을 사용하는 경우 실패합니다. 제 경험은 꽤 자주 그렇습니다. 그래서 저는 $PWD를 사용합니다.

모든 괴짜들처럼 저만의 쉘 스크립팅 튜토리얼

Comme nts

  • `command` 구문이 바람직하지 않고 $(command)이 선호됩니다. 내가 아는 한 후자는 POSIX와 호환되지만 ' 100 % 확실하지는 않습니다.
  • @Minix $()는 실제로 POSIX에 의해 지정되므로 Solaris 10 및 이전 버전 및 csh 파생 셸에서 사용할 수있는 이전 POSIX /bin/sh 외부에서는 많은 것을 의심합니다. 다른 주류 셸에는 해당 기능이 없습니다.
  • @Minix : 여기 가이 사이트의 최근 질문으로 대신 백틱을 사용할 때의 한 가지 문제를 설명합니다. $()
  • 정답입니다. $ () 대신 백틱을 사용할 수 있습니다. 그러나 이것은 계단식이 아니므로 언급하지 않았습니다.
  • 튜토리얼에 멋진 미니 맵이 있습니다 ….

답변

$PWD가 바람직합니다. 쉘 변수로서 거의 즉시 해결할 수 있습니다. $(pwd)는 좀 더 혼란 스럽습니다. Bash가있는 시스템에서 man 1 bulitin를 검사하면 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 초, $PWD. 기타 관련없는 프로세스뿐만 아니라 서브 쉘의 불필요한 실행은 가능하면 피해야합니다. “다른 언어에서 사용할 수있는 함수 호출보다 훨씬 비쌉니다.

댓글

  • 그 '는 흥미롭지 만 ' 쉘 스크립트의 성능에 대해 걱정하는지 모르겠습니다. 또한 성능이 어떻게 변할지 궁금합니다. 쿼리 사이에 암호가 변경됩니다.
  • @Minix 루프 본문이 echo $PWD; pushd ..; echo $PWD; popd가되도록 스크립트를 수정했습니다 (추가 >/dev/null 각 문 후), 0.05 초가 소요됩니다. 그런 다음 echo 문 (pushd / popd 만 해당)을 제거했고 0.03이 걸렸습니다.따라서 echo $PWD 당 시간은 여전히 0.01 초 정도였습니다. $(pwd)로 비슷한 작업을했고 각 루프에 2.2 초가 걸렸으므로 $(pwd) 호출 당 1.1 초가 걸렸습니다.
  • 너무 까다 롭지는 않지만 $PWD를 대체 할 계산이 echo 문을 평가하기 전에 백그라운드에서 수행 될 것이라고 상상할 수 있습니다. 그러나 분명히 $PWD에 액세스하는 것이 훨씬 더 빠르기 때문에 호환성이 문제가되지 않는 경우 하나를 선택해야하는 이유입니다. 이것을 철저히 테스트 해주셔서 감사합니다. 🙂

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다