[linux] 쉘 스크립트에서“cd”가 작동하지 않는 이유는 무엇입니까?

현재 디렉토리를 내 프로젝트 디렉토리로 변경하는 작은 스크립트를 작성하려고합니다.

#!/bin/bash
cd /home/tree/projects/java

이 파일을 proj로 저장하고에 실행 권한을 추가 chmod하고에 복사했습니다 /usr/bin. 내가 전화하면 :
proj아무것도하지 않습니다. 내가 무엇을 잘못하고 있지?



답변

쉘 스크립트는 서브 쉘 내에서 실행되며 각 서브 쉘에는 현재 디렉토리에 대한 자체 개념이 있습니다. 은 cd성공하지만 곧 서브 쉘 종료, 당신은있는 대화 형 쉘 다시 아무것도 이제까지이 변경되었습니다.

이 문제를 해결하는 한 가지 방법은 별명을 대신 사용하는 것입니다.

alias proj="cd /home/tree/projects/java"


답변

당신은 아무것도 잘못하고 있지 않습니다! 디렉토리를 변경했지만 스크립트를 실행하는 서브 쉘 내에서만 가능합니다.

“dot”명령을 사용하여 현재 프로세스에서 스크립트를 실행할 수 있습니다.

. proj

그러나 나는이 간단한 경우에 별칭을 사용하는 Greg의 제안을 선호합니다.


답변

cd스크립트에서 기술적으로 작동 이 스크립트를 실행 한 쉘의 디렉토리를 변경으로,하지만 대화 형 쉘에서 포크 별도의 프로세스이었다.

이 문제를 해결하기위한 Posix 호환 방법 은 쉘 호출 명령 스크립트 대신 쉘 프로 시저 를 정의하는 것 입니다.

jhome () {
  cd /home/tree/projects/java
}

이것을 입력하거나 다양한 쉘 시작 파일 중 하나에 넣을 수 있습니다.


답변

cd스크립트의 쉘 내에서 수행된다. 스크립트가 끝나면 해당 셸이 종료되고 현재 디렉토리에 남아있게됩니다. 스크립트를 “소스”로 실행하지 마십시오. 대신에:

./myscript.sh

하다

. ./myscript.sh

(스크립트 이름 앞에 점과 공백이 있습니다.)


답변

선택 디렉토리로 cd 할 bash 스크립트를 작성하려면 다음을 수행하십시오.

스크립트 파일 작성

#! / bin / sh
# 파일 : / scripts / cdjava
#
CD / home / askgelal / projects / java

그런 다음 시작 파일에 별명을 작성하십시오.

#! / bin / sh
# 파일 /scripts/mastercode.sh
#
별명 cdjava = '. / scripts / cdjava '

  • 모든 별명과 사용자 정의 함수를 덤프하는 시작 파일을 작성했습니다.
  • 그런 다음이 파일을 .bashrc에 소스하여 각 부팅마다 설정하십시오.

예를 들어, 마스터 별명 / 함수 파일을 작성하십시오. /scripts/mastercode.sh
(이 파일에 별명을 입력하십시오.)

그런 다음 .bashrc 파일 의 끝에서 :

소스 /scripts/mastercode.sh


이제 java 디렉토리로 쉽게 CD를 입력 할 수 있습니다. cdjava 만 입력하면됩니다.


답변

.현재 쉘 환경에서 스크립트를 실행하는 데 사용할 수 있습니다 .

. script_name

또는 더 읽기 쉽지만 쉘 특정 별명 source:

source script_name

이것은 서브 쉘을 피하고 변수 나 내장 (포함 cd)이 현재 쉘에 영향을 줄 수 있도록합니다 .


답변

제레미 루텐 (Jeremy Ruten)의 심볼릭 링크 사용에 대한 아이디어는 다른 답변을 넘어 가지 않은 생각을 촉발 시켰습니다. 사용하다:

CDPATH=:$HOME/projects

선행 콜론이 중요합니다. 즉, 현재 디렉토리에 ‘dir’디렉토리가 있으면 ‘ cd dir‘는 다른 곳을 호핑하지 않고 해당 디렉토리로 변경합니다. 표시된대로 값을 설정하면 다음을 수행 할 수 있습니다.

cd java

그리고 현재 디렉토리에 java라는 하위 디렉토리가 없으면 $ HOME / projects / java로 직접 이동합니다. 별명, 스크립트, 모호한 실행 또는 점 명령이 없습니다.

내 $ HOME은 / Users / jleffler입니다. 내 $ CDPATH는 다음과 같습니다

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work