현재 작업 디렉터리를 간단히 변경하는 스크립트를 실행하고 싶습니다.
#!/bin/bash cd web/www/project
하지만 실행 후 현재 암호는 변경되지 않습니다! 어떻게해야합니까?
답변
예상되는 동작입니다. 스크립트는 서브 쉘에서 실행되며 상위 쉘 작업 디렉토리를 변경할 수 없습니다. 완료되면 효과가 사라집니다.
현재 셸의 디렉토리를 영구적으로 변경하려면 source
명령을 사용해야합니다. 또한 단순히 .
는 하위 셸 대신 현재 셸 환경에서 스크립트를 실행합니다.
다음 명령은 동일합니다.
. script
또는
source 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
return
는exit
가 아니라 이러한 방식으로 제공된 스크립트에서 이스케이프합니다. 셸 함수와 같으며exit
는 스크립트를 소싱 한 셸을 종료합니다.source ./script
이 동일합니까?.
및source
는 bash에서 동일합니다. 2. 우리는 ' 같은 디렉토리에있는 경우 파일 이름 앞에./
를 사용할 필요가 없습니다. ' 다음 항목 만 실행해도됩니다.. script