bash 스크립트 하위 쉘 외부에서 cd ​​명령이 작동하도록 하려면 어떻게 해야 합니까? [복사]

bash 스크립트 하위 쉘 외부에서 cd ​​명령이 작동하도록 하려면 어떻게 해야 합니까? [복사]

나는 이 스크립트를 만들었습니다:

#!/bin/bash

if [[ $# -ne 1 ]]; then
  echo "only use one argument"
  exit 1
fi

mkdir $1
sleep 0.5
cd $1

exit 0

crdir asd나중에 /usr/bin에 넣어 스크립트를 작성할 때마다 디렉토리가 생성되고 현재 디렉토리가 새 디렉토리로 자동 변경 되도록 스크립트를 만들고 싶습니다 .

schel 스크립트는 분명히 서브쉘이고 cd 명령은 서브쉘 외부에서는 적용되지 않기 때문에 이 방법은 작동하지 않습니다. 그렇다면 어떻게 해야 합니까?

나는 그것을 "얻어야" 하고 앞쪽에 있는 지점을 실행해야 한다고 온라인에서 읽었습니다 . ./crdir asd. 명령.

어떤 팁이 있나요?

편집: 나도 시도해 보았지만 이전 명령에 대한 인수로 mkdir aaa; cd !#작동하지 않았습니다 .!#

답변1

함수로 만드세요:

crdir() {
  if [ "$#" -eq 1 ]; then
    mkdir -p -- "$1" && cd -P -- "$1"
  else
    echo >&2 "Usage: crdir <directory-path>"
    return 1
  fi
}

이것을 ~/.bashrc.

귀하의 방법은 (인수를 받을 수 있는 셸 . crdir에서도) 작동 하지만 셸을 종료시키는 방법을 제거해야 합니다 . 또한 POSIX 모드가 아닌 경우 현재 디렉토리에서 찾고 있는 파일을 찾을 수 없으면 약간 위험해집니다(마지막에 항목을 추가하거나 비우는 것과 동일한 수준 ).bash.exit 0bash$PATH.$PATH

또한 . crdir인수 없이 호출되면 스크립트는 셸의 위치 인수를 상속합니다. 예를 들어 set foo; . crdir오류가 반환되지 않고 foo디렉터리가 생성됩니다.

스크립트에 대한 몇 가지 추가 참고 사항:

#!/bin/bash

파일을 가져올 때 she-bang은 무시됩니다(단지 주석으로 처리됨).

if [[ $# -ne 1 ]]; then
  echo "only use one argument"

stderr()에 echo >&2 text오류 메시지를 출력하는 것이 더 좋습니다.

  exit 1
fi

mkdir $1

따옴표가 없는 매개변수 확장은 에서 특별한 의미를 가지며 bash, 이를 거의 수행해서는 안 됩니다.

또한 $1로 시작하는 경우에는 -옵션으로 처리됩니다 mkdir. option으로 시작하더라도 옵션이 아님 을 --알리려면 option 닫는 태그를 사용해야 합니다 .mkdir$1-

mkdir또한 명령이 성공했는지 확인하지 않았습니다 .

모든 디렉터리 구성 요소가 생성되고 디렉터리가 이미 존재하는 경우 실패가 반환되지 않음을 -p나타내는 옵션을 사용할 수도 있습니다 . 그래서:mkdirmkdir

 mkdir -p -- "$1" &&
sleep 0.5

잠을 잘 필요가 없습니다. 성공적인 반환은 디렉토리가 생성되었음을 확인하는 것입니다 mkdir.

cd $1

-다시 한번 말씀드리지만, 인용문과 질문이 있습니다 . 또한 다음과 같은 다른 유틸리티와 함께 ​​사용하도록 선택 bash해야 합니다 .-Pcdmkdir

 cd -P -- "$1"

( 지금은 -or 라는 경로를 무시하세요 $CDPATH. or 는 사용하지 말고 정상적인 값만 사용하시기 바랍니다.)

exit 0

또 종료 상태를 확인하지 않고 cd돌아왔습니다.성공종료 상태(짝수 mkdir또는 cd실패)입니다. 스크립트를 가져오면 소스 셸에서 해석되므로 스크립트 exit가 종료됩니다.

여기서는 스크립트를 다음과 같이 다시 작성합니다.

if [ "$#" -eq 1 ]; then
  mkdir -p -- "$1" && cd -P -- "$1"
else
  ! echo >&2 "Usage: crdir  <directory-path>"
fi

답변2

기능은 어떻습니까?

crdir() { mkdir $1; cd $1; }

관련 정보