[shell] 유닉스 쉘 스크립트는 스크립트 파일이 어느 디렉토리에 있는지 알아?
기본적으로 쉘 스크립트 파일 위치와 관련된 경로로 스크립트를 실행해야합니다. 현재 디렉토리를 스크립트 파일이있는 디렉토리와 동일한 디렉토리로 변경하려면 어떻게해야합니까?
답변
Bash에서는 다음과 같이 필요한 것을 얻습니다.
#!/usr/bin/env bash
BASEDIR=$(dirname "$0")
echo "$BASEDIR"
답변
원래 게시물에는 솔루션이 포함되어 있습니다 (응답을 무시하고 유용한 것은 추가하지 마십시오). 흥미로운 작업은 언급 된 unix 명령 readlink
과 옵션으로 수행됩니다 -f
. 스크립트가 상대 경로뿐만 아니라 절대 경로에 의해 호출 될 때 작동합니다.
bash의 경우 sh, ksh :
#!/bin/bash
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=$(readlink -f "$0")
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=$(dirname "$SCRIPT")
echo $SCRIPTPATH
tcsh의 경우 csh :
#!/bin/tcsh
# Absolute path to this script, e.g. /home/user/bin/foo.csh
set SCRIPT=`readlink -f "$0"`
# Absolute path this script is in, thus /home/user/bin
set SCRIPTPATH=`dirname "$SCRIPT"`
echo $SCRIPTPATH
참조 : https : //.com/a/246128/59087
답변
답변에 대한 이전의 의견이 그것을 말했지만 다른 모든 답변 중에서 놓치기 쉽습니다.
bash를 사용할 때 :
echo this file: "$BASH_SOURCE"
echo this dir: "$(dirname "$BASH_SOURCE")"
답변
bash를 사용한다고 가정합니다.
#!/bin/bash
current_dir=$(pwd)
script_dir=$(dirname $0)
echo $current_dir
echo $script_dir
이 스크립트는 사용자가있는 디렉토리를 인쇄 한 다음 스크립트가있는 디렉토리를 인쇄해야합니다. 예를 들어 /
에서 스크립트 를 사용하여 호출 /home/mez/
하면 출력됩니다.
/
/home/mez
명령의 출력에서 변수를 할당 할 때,에서 명령을 포장 기억 $(
하고 )
또는 당신이 원하는 출력을받지 않습니다 -.
답변
bash를 사용하는 경우 ….
#!/bin/bash
pushd $(dirname "${0}") > /dev/null
basedir=$(pwd -L)
# Use "pwd -P" for the path without links. man bash for more info.
popd > /dev/null
echo "${basedir}"
답변
TheMarko가 제안한 바와 같이 :
BASEDIR=$(dirname $0)
echo $BASEDIR
스크립트가있는 동일한 디렉토리에서 스크립트를 실행하지 않으면 ‘.’값을 얻지 않는 한 작동합니다.
이 문제를 해결하려면 다음을 사용하십시오.
current_dir=$(pwd)
script_dir=$(dirname $0)
if [ $script_dir = '.' ]
then
script_dir="$current_dir"
fi
이제 스크립트 전체에서 current_dir 변수를 사용하여 스크립트 디렉토리를 참조 할 수 있습니다. 그러나 여전히 symlink 문제가있을 수 있습니다.
답변
이 질문에 대한 가장 좋은 대답은 여기에서 대답했습니다 :
Bash 스크립트의 소스 디렉토리 가져 오기
그리고 그건:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
스크립트는 어디에서 호출 되든지 스크립트의 전체 디렉토리 이름을 제공합니다.
작동 방식을 이해하려면 다음 스크립트를 실행할 수 있습니다.
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
TARGET="$(readlink "$SOURCE")"
if [[ $TARGET == /* ]]; then
echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
SOURCE="$TARGET"
else
DIR="$( dirname "$SOURCE" )"
echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
fi
done
echo "SOURCE is '$SOURCE'"
RDIR="$( dirname "$SOURCE" )"
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
if [ "$DIR" != "$RDIR" ]; then
echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"