현재 디렉터리를 변경하는 스크립트 (cd, pwd)

현재 작업 디렉터리를 간단히 변경하는 스크립트를 실행하고 싶습니다.

#!/bin/bash cd web/www/project 

하지만 실행 후 현재 암호는 변경되지 않습니다! 어떻게해야합니까?

답변

예상되는 동작입니다. 스크립트는 서브 쉘에서 실행되며 상위 쉘 작업 디렉토리를 변경할 수 없습니다. 완료되면 효과가 사라집니다.

현재 셸의 디렉토리를 영구적으로 변경하려면 source 명령을 사용해야합니다. 또한 단순히 .는 하위 셸 대신 현재 셸 환경에서 스크립트를 실행합니다.

다음 명령은 동일합니다.

. script 

또는

source script 

댓글

  • @Sony : 다음을 사용해야합니다. returnexit가 아니라 이러한 방식으로 제공된 스크립트에서 이스케이프합니다. 셸 함수와 같으며 exit는 스크립트를 소싱 한 셸을 종료합니다.
  • @CharlesStewart 사실 저는 ' 소싱 된 스크립트에 익숙하지 않습니다. 감사합니다!
  • source ./script이 동일합니까?
  • @amyassin : 예, 그렇습니다
  • 1. .source는 bash에서 동일합니다. 2. 우리는 ' 같은 디렉토리에있는 경우 파일 이름 앞에 ./를 사용할 필요가 없습니다. ' 다음 항목 만 실행해도됩니다. . script

Answer

이와 같은 작은 작업의 경우 스크립트를 만드는 대신 다음과 같은 별칭을 만듭니다.

$ alias cdproj="cd /dir/web/www/proj" 

파일 (모든 대화 형 셸에 대해 설정하려는 경우)

이제 $ cdproj로 실행할 수 있습니다.

주석

  • 실행할 명령을 스크립트에 반영한 다음 eval `./script` 또는 eval $(./script) 명령을 실행합니다. 이것은 호출 셸 '의 환경을 업데이트해야하는 명령에 대한 일반적인 접근 방식입니다.
  • 가는 경우 출력 할 내용에 매우주의해야합니다. eval 접근 방식

답변

exec bash 끝에

bash 스크립트는 현재 환경 또는 하위 환경에서 작동하지만 부모 환경.

그러나이 질문은 종종 배쉬에 남아 있기를 원하기 때문에 자주 묻는 질문입니다. 다른 디렉토리에서 bash 스크립트를 실행 한 후 특정 디렉토리에 프롬프트합니다.

이 경우에는 끝에서 자식 bash 인스턴스를 실행하면됩니다. 스크립트 설명 :

#!/usr/bin/env bash cd desired/directory exec bash 

새 하위 셸을 만듭니다. 스크립트가 처음 시작된 첫 번째 셸로 돌아가려면 Ctrl + D 또는 exit를 입력합니다.

업데이트

적어도 bash의 최신 버전에서는 마지막 줄의 exec가 더 이상 필요하지 않습니다. 또한 $SHELL 환경 변수를 사용하여 원하는 셸과 함께 작동하도록 스크립트를 만들 수 있습니다. 그러면 다음이 제공됩니다.

#!/usr/bin/env bash cd desired/directory $SHELL 

댓글

  • 허용 된 답변에서와 같이 스크립트 소스 만 사용하는 것이 좋습니다. : exec를 사용하는 것은 일반적으로 악당의 마지막 수단으로 간주됩니다. 🙂
  • 이 트릭은 '하지 않습니다. 데비안 9 스트레치에서 작업하십시오.
  • 이 문제를 해결하는 잘못된 방법입니다!
  • 아무도이 문제에 대해 자세히 설명하지 않았기 때문에 (@Dennis) : (1) 이것을 실행할 때마다 새롭고 지속적인 bash 프로세스가 생성됩니다. 한 세션에서 10 ~ 20 회 수행하면 11 ~ 21 개의 bash 프로세스가 쌓입니다. 이는 성능에 영향을 미칠 수 있으며 exit (또는 Ctrl + D)를 입력하여 세션을 깨끗하게 종료하려고하면 11 ~ 21 번 수행해야합니다. (2) 실행 가능한 스크립트 사용의 또 다른 단점은 셸 옵션 (예 : dotglob 또는 globstar)을 대화 형 셸 세션을 사용하면 새 셸을 시작하기 때문에 잃게됩니다.
  • 매우 멋진 솔루션입니다! ' bash_profile에 별칭을 다시 작성 했으므로 이제 별도의 파일에 저장된 스크립트입니다. 스크립트를 사용하여 새로 생성 된 임시 폴더로 이동합니다. 이제 임시 bash 세션을 갖는 것이 훨씬 더 쉽습니다. 실행중인 SRP! 감사!

Answer

원하는 정확한 작업을 수행하는 답변이 있지만 이에 대한보다 표준적인 방법 목적은 심볼릭 링크를 만드는 것입니다.

ln -s ~/web/www/project proj #use full path to dir! 

그런 다음 cd라는 이름을 사용하여 디렉토리로 이동할 수 있습니다. = “6e24851ea5″>

:

cd proj 

이 방법은 :

ls proj/ #note the endslash! vim proj/file.x 

답변

사용자에 따라 다름 “할 것입니다. 다른 솔루션은 스크립트 대신 함수를 만드는 것입니다.

예 :

파일에서 함수를 만듭니다. :

function my-cd() { cd /to/my/path } 

그런 다음 bashrc 또는 파일 :

# Somewhere in rc file source /home/aidin/my-cd-script 

이제 명령처럼 사용할 수 있습니다.

$ my-cd 

답변

파일 시스템에서 멀리 떨어진 디렉토리간에 변경하는 경우. autojump 를 권장합니다.

답변

저에게 가장 편리하고 유연한 접근 방식은 별칭과 스크립트를 혼합하는 것이 었습니다.

임의의 논리로 스크립트 만들기

여기서 디렉터리로 변경하고 적절한 Python 환경을 활성화하는 스크립트를 만듭니다. 스크립트 위치는 /path/to/workon_myproj.sh에 예시입니다.

#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate 

스크립트를 소스로하는 별칭 만들기

alias workon_myproj="source /path/to/workon_myproj.sh" 

예를 들어 적절한 쉘 시작 파일에 별칭 정의를 추가합니다. .profile, .bashrc 또는 .zshrc.

결과

이제 원하는 디렉토리의 스크립트 내용을 제공하는 셸에서 workon_myproj를 간단히 실행할 수 있습니다.

확장 성

특정 작업 디렉토리의 여러 프로젝트에서 작동하도록 인수를 받도록 스크립트를 개선하거나 git pull와 결합하여 즉시 최신 변경 사항을 가져올 수 있습니다. on … 특정 프로젝트에서 계속 작업 할 때 수행하는 모든 보일러 플레이트 작업입니다.

답변

“를 사용하지 않는 이유 exec “는 내가 원하는 것을 정확히 수행하도록 이음새를 만듭니다.

#!/bin/bash cd someplace exec bash ~/someplace 

댓글

  • 원하는 것이 인 것 같습니다 . (거대한 목마! 내가 원했던 것입니다!) 이것을 실행할 때마다 새롭고 지속적인 bash 프로세스가 생성됩니다. 한 세션에서 10 ~ 20 회 수행하면 11 ~ 21 개의 bash 프로세스가 쌓입니다. 이는 성능에 영향을 미칠 수 있으며 exit (또는 Ctrl + D)를 입력하여 세션을 깨끗하게 종료하려고하면 11 ~ 21 번 수행해야합니다.
  • 어디에서 문제가 될지 확실히 알 수있었습니다. 저에게는 ' 한 번만 사용하고 필요한 작업을 수행 한 다음 종료합니다. '가 유일한 단점 인 경우 그것으로 살 수 있습니다. 반면에 더 나은 해결책이 있다면 ' 기꺼이 살펴 보겠습니다.
  • 쉘 함수를 사용하는이 질문에 대한 Aidin의 대답 과 별칭을 사용하는 Sachin Divekar의 대답 은 스크립트를 사용하는 것보다 (IMO) 더 나은 솔루션입니다. . 추신 스크립트 사용의 또 다른 단점은 셸 옵션 (예 : dotglob 또는 globstar)을 설정하면 해당 옵션이 손실된다는 것입니다. 새 셸을 시작하기 때문입니다. … (계속)
  • (계속)… P.P.S. 기본적으로 Serge Stroobandt의 답변 을 반복하고“이렇게하지 않는 이유가 무엇입니까?“라고 말하는 것을 확인했습니다. Stack Exchange 는 다른 답변에 대한 논의뿐만 아니라 새로운 아이디어 및 / 또는 정보를 제공하는 답변을 기대합니다.

답변

answer by Serge David의 관련없는 답변 . 디렉터리를 변경 한 다음 bash 셸을 강제하는 대신 사용자의 기본 셸 을 시작합니다. getent/etc/passwd 모두 기본 셸을 감지합니다.

 #!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL  

물론 중첩 된 셸을 만드는 것과 동일한 결함이 있습니다.

답변

함수를 사용하거나 & & 다음 예제는 Zabbix를 설치하고 내부에 줄이있는 파일.

예 :

#!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix 

또는 :

#!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다