나는 이 스크립트를 만들었습니다:
#!/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 0
bash
$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
나타내는 옵션을 사용할 수도 있습니다 . 그래서:mkdir
mkdir
mkdir -p -- "$1" &&
sleep 0.5
잠을 잘 필요가 없습니다. 성공적인 반환은 디렉토리가 생성되었음을 확인하는 것입니다 mkdir
.
cd $1
-
다시 한번 말씀드리지만, 인용문과 질문이 있습니다 . 또한 다음과 같은 다른 유틸리티와 함께 사용하도록 선택 bash
해야 합니다 .-P
cd
mkdir
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; }