bash 스크립트가 사용자에게 스크립트가 실행되는 디렉토리를 알려줄 수 있습니까?

bash 스크립트가 사용자에게 스크립트가 실행되는 디렉토리를 알려줄 수 있습니까?

쉘 스크립트는 사용자가 실행 중인 디렉토리를 알 수 있습니까? 나는 하위 디렉터리 목록을 살펴보고 거기에서 일부 git 명령을 실행하는 이와 같은 스크립트를 개발하려고 합니다. 한 가지 방법은 이를 전달하는 것일 수 있지만 pwd몇 가지 추가 매개변수가 필요하므로 내장 함수를 사용하여 작업 디렉터리를 가져오고 싶습니다.

이 예에서는 현재 디렉터리를 가정합니다.

#!/bin/bash

for d in */ ; do
  echo ""
  echo "===================="
  echo ""
  echo "$d"

  git -C "$d" remote show origin
  echo ""
  echo "===================="
  echo ""
done

답변1

POSIX 셸(예: )을 실행하고 POSIX 셸의 특수 변수 (하위 프로세스에서 상속되고 명령 실행 중에 저장되는 프로세스 속성) bash에 현재 작업 디렉터리에 대한 경로를 생성합니다 . fish-like shell에 $PWD해당하는 것은 .csh$cwd

이 변수는 동적입니다. 현재 디렉토리를 변경하는 명령(예: cd(또는 일부 쉘에서는 / pushd))을 호출한 후 해당 내용이 변경될 수 있습니다. popdPOSIX 쉘은 또한 $OLDPWD호출이 성공하기 전의 이전 작업 디렉토리를 포함하는 변수를 유지합니다 cd.pushdpopd

pwd명령은 현재 디렉터리의 경로를 인쇄합니다. POSIX 셸에서 이 명령은 일반적으로 내장되어 있으며 $PWD.

스크립트가 시작될 때 작업 디렉터리를 알고 싶다면 다음과 같이 스크립트 시작 부분에 기록해야 합니다.

#! /bin/sh -
original_PWD=$PWD
...
cd ...

상위 프로세스의 현재 작업 디렉토리를 알기 위해 GNU/Linux에서는 다음을 수행할 수 있습니다.

parent_PWD=$(readlink -ve "/proc/$PPID/cwd")

하지만 귀하는 항상 이 정보에 접근할 수 있는 것은 아닙니다. 부모님이 돌아가시면 귀하 init는 수확자(있는 경우)에게 입양되거나 입양됩니다. 하지만 $PPID그럴 것이다아니요업데이트되므로 이 경우 잘못된 프로세스의 cwd를 얻을 수 있습니다(상위 프로세스의 pid가 재사용된 경우).

답변2

물론 스크립트는 이를 실행하는 쉘/프로그램의 현재 디렉토리를 상속받습니다. 따라서 스크립트 cd자체가 그렇게 하지 않는 한 모든 파일 이름 참조는 해당 파일 이름을 기준으로 합니다. 스크립트 파일 자체의 위치를 ​​아는 것은 어렵고 거의 불가능합니다.

답변3

이 작업을 수행하는 환경 변수는 없다고 생각하지만, 많은 명령 없이도 쉽게 사용할 수 있도록 직접 만들 수 있습니다.

예를 들어:

#!/bin/bash
starting_dir=$(pwd)  #use pwd to get the starting directory

#do things
cd some_example_dir/
#do more things

cd $starting_dir  #go back to the directory

이 경우에는 시작 디렉터리의 경로를 변수에 문자열로 저장하면 됩니다 $starting_dir. 절대경로로 저장되어 cd언제든지 접근이 가능합니다.

관련 정보