BASH 스크립트는 선택적으로 작동합니다.

BASH 스크립트는 선택적으로 작동합니다.

/etc/bash.bashrc오랫동안 사용해오던 BASH 기능이 많이 있습니다 . 그들은 ~/.bashrcOSX 안팎에서 ~/.bash_profile다음과 같이 작동합니다:

mcdir(){
    mkdir "$1";
    eval cd "$1";
}

이것은 단지 짧은 예일 뿐이며 매일 사용합니다. 그것은 단지 주어진 디렉토리를 생성하고 그것을 변경하는 것뿐입니다. mkdir "$1" && cd "$1"나는 단지 게으른 것뿐입니다.

요점은 효과가 있다는 것입니다. 수년 동안 사용해 왔기 때문에 효과가 있다는 것을 알고 있습니다.

이제 최근에 이를 my에서 제거 하고 (and ) 로 bashrc넣었으므로 실제로는 아무것도 변경되지 않았습니다. 여기에서는 다음과 같습니다./usr/local/binmcdirchmod +x /usr/local/bin/mcdir

#!/bin/bash

mkdir "$1";
eval cd "$1";

모든 의도와 목적을 위해 이는 위의 기능과 정확히 동일해야 합니다. 문제는 절반만 작동한다는 것이다. 새 디렉토리가 생성되지만안 돼요그것으로 바꾸십시오.

내가 여기서 뭘 잘못하고 있는지 및/또는 해결 방법을 아는 사람이 있나요?


제가 가지고 있는 또 다른 예는 다음과 같은 cdd함수 입니다.bashrc

cdd(){
    cd "$1";
    echo -e "\033[101m" $(pwd) "\033[49m";
    ls -l;
}

이것은 아주 잘 작동합니다! 그러나 이를 자체 스크립트에 넣고 다음 /usr/local/bin과 같이 실행 가능하게 만들면:

cd "$1";
echo -e "\033[101m" $(pwd) "\033[49m";
ls -l;

실제로 디렉토리로 변경되지는 않습니다. 그러면 pwd및 이 제공되지만 ls -l디렉토리는 전혀 변경되지 않습니다.

답변1

스크립트는 서브셸에서 실행됩니다. 함수와 동일한 방식으로 활성 셸 세션의 환경에 영향을 줄 수 없습니다. 예를 들어고급 Bash 스크립팅 가이드, 21장: 서브셸:

서브쉘은 명령 프로세서의 별도 인스턴스입니다.껍데기이렇게 하면 콘솔이나 콘솔에 프롬프트가 표시됩니다.xterm창문. 명령줄 프롬프트에서 명령이 해석되는 것처럼 스크립트도 비슷하게 해석됩니다.일괄 처리명령 목록. 실행되는 각 셸 스크립트는 실제로 하위 프로세스(하위 프로세스) 의부모껍데기.

또는Bash 참조 매뉴얼, 섹션 3.8: 쉘 스크립트:

chmod 명령을 사용하여 실행 비트를 켜면 쉘 스크립트를 실행 가능하게 만들 수 있습니다. Bash가 명령을 검색하는 동안 이러한 파일을 찾으면 $PATH이를 실행하기 위한 하위 쉘이 생성됩니다. 즉, 실행

filename arguments

실행과 동일

bash filename arguments

if는 filename실행 가능한 쉘 스크립트입니다. 하위 쉘은 자체적으로 다시 초기화되므로 상위 쉘이 명령 위치를 기억한다는 점을 제외하면 스크립트를 해석하기 위해 새 쉘이 호출된 것과 같은 효과가 있습니다( hash설명 참조).Bourne Shell 내장 함수)은 아이가 보관합니다.

함수 대신 스크립트를 사용하고 싶다면 source실행하는 대신 사용하면 되지만, 솔직히 지금 하고 있는 일에는 함수(또는 별칭)를 계속 사용하는 것이 더 낫다고 생각합니다.

즉, 코드를 재구성하려면 ~/.bashrc코드를 별도의 파일로 나눈 다음 source해당 파일을 에서 이동할 수 있습니다 ~/.bashrc. 예를 들어 해당 파일을 로컬 하위 디렉터리(예: )에 넣을 수 있습니다 ~/.bashrc.d.

관련 정보