쉘 스크립트의 명령은 pwd
쉘 스크립트가 있는 디렉토리를 출력합니까?
답변1
여기에는 세 가지 별도의 "디렉토리"가 있습니다.
- 현재 쉘의 현재 작업 디렉토리,
- 쉘 스크립트의 현재 작업 디렉토리
- 쉘 스크립트가 포함된 디렉토리입니다.
이들이 독립적이라는 것을 증명하기 위해 다음을 포함하는 /tmp/pwd.sh에 저장된 쉘 스크립트를 작성할 수 있습니다.
#!/bin/sh
pwd
cd /var
pwd
그런 다음 비밀번호(위의 #1)를 /로 변경할 수 있습니다.
cd /
스크립트를 실행합니다.
/tmp/pwd.sh
먼저 기존 비밀번호를 시연한 다음(#1), /var로 변경하고 다시 표시합니다(#2). 이들 중 어느 것도 pwd
/tmp/pwd.sh(#3)를 포함하는 디렉토리인 "/tmp"가 아닙니다.
답변2
현재(또는 현재) 작업 디렉터리
쉘 스크립트의 pwd 명령은 쉘 스크립트가 있는 디렉토리를 반환합니까?
아니요.
첫째, 정의에 따라 쉘 스크립트나 쉘 명령은 0 - 255 사이의 숫자 종료 상태를 제외한 어떤 것도 반환하지 않습니다. 이것은 자명하지만 일반적으로 사람들이 이런 유형의 질문을 할 때 의미하는 바는 아닙니다.
둘째, pwd
둘 다이다.Bourne 쉘 내장표준 시스템 바이너리. 누구나인쇄논리적 또는 물리적현재 작업 디렉토리,일반적으로:
- 스크립트나 바이너리가 호출될 때 디렉터리 구조에서의 위치입니다.
- 작업 디렉터리 변경 후 현재 위치CD또는 Pushd 또는 Popd와 같이 현재 작업 디렉토리를 수정하는 기타 유틸리티 및 내장 기능입니다.
현재 스크립트의 디렉토리를 원하면 dirname
아래 마지막 섹션에 설명된 유틸리티를 사용하십시오.
빠른 테스트pwd
무슨 일이 일어나는지 확인하기 위한 빠른 테스트로비밀번호실제로 인쇄하려면 다음 명령을 실행하면 됩니다.
# Create a shell script containing pwd.
cat <<-EOF > /tmp/test_pwd.sh
#!/bin/sh
pwd
EOF
# Make the script executable.
chmod 755 /tmp/test_pwd.sh
# Go somewhere on the filesystem, and call the test script.
cd /etc
/tmp/test_pwd.sh
현재 작업 디렉토리가 current 이기 때문에 /etc
대신 인쇄됩니다 . 이는 예상된 동작입니다./tmp
/etc
스크립트가 포함된 디렉터리를 가져옵니다.
현재 스크립트의 디렉터리를 찾고 싶기 때문에 이 질문을 할 수도 있습니다. 일반적으로 다음은 빠르고 더러운 솔루션입니다.
#!/usr/bin/env bash
echo $(dirname "$0")
$0
이는 실행 중인 스크립트를 호출하는 데 사용되는 경로 이름이 일반적으로 포함되고 dirname
유틸리티는 파일 이름 부분을 제외한 경로를 반환하기 위해 셸 확장에서 사용되기 때문에 작동합니다 . Bash 매개변수 확장을 사용하여 유사한 작업을 수행할 수 있지만 이식성이 떨어집니다 "${0%/*}"
.
물론 이것은 모두 지나치게 단순화된 것입니다. 읽어주세요배쉬 매뉴얼(특히 위치 매개변수, 특수 매개변수 및BASH_SOURCEreadlink
) 뿐만 아니라 realpath
극단적인 경우에 대한 보다 완전한 살펴보기를 위한 매뉴얼 페이지도 있으며 그 중 몇 가지가 있습니다.
그러나 일상적인 스크립팅에서는 디렉토리 구성 요소만으로도 $0
알고 싶은 내용을 충분히 알 수 있습니다. 수행 중인 작업이 충분히 복잡하지만 $0
실제로 필요한 정보를 저장할 수 없고 다음과 같이 더 복잡한 구성이 필요한 경우:
echo $(dirname "$(realpath "$0")")
그러면 당신의 삶이 필요 이상으로 더 어려워질 수도 있습니다.
답변3
pwd
현재 작업 디렉터리를 열 수 없으면 0을 반환합니다.
mkdir /tmp/d; cd "$_"
pwd && pwd -P; echo "$?"
rmdir ../d
pwd && pwd -P; echo "$?"
/tmp/d
/tmp/d
0
/tmp/d
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1
답변4
스크립트가 있는 위치가 아니라 호출/실행된 디렉토리를 반환합니다!
이것은 try.sh입니다:
echo "The current working directory: $PWD"
이 출력은 더 명확해집니다.
[akarpe@ADM-PROD-OMNI ~]$ sh try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ cd try
[akarpe@ADM-PROD-OMNI try]$ sh ./try.sh
The current working directory: /mnt/home/akarpe/try
[akarpe@ADM-PROD-OMNI try]$ sh ../try.sh
The current working directory: /mnt/home/akarpe/try