[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 참조 매뉴얼, 5.2 Bash 변수


답변

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'"