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


44

현재 작업 디렉토리를 간단하게 변경하기 위해 스크립트를 실행하고 싶습니다.

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

그러나 그것을 실행 한 후에도 현재 암호는 변경되지 않습니다! 어떻게해야합니까?

답변:


63

예상되는 동작이며 이미 여러 번 논의되었습니다.

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

디렉토리를 영구적으로 변경하려면 다음 과 같이 스크립트를 소싱 해야 합니다 .

. ./script

8
@Sony : 사용한다는 것을 참고 return이 방법으로 공급 스크립트에서, 아니 탈출 exit- 그들은 쉘 기능처럼, 그리고 exit스크립트를 소스 쉘을 종료합니다.
Charles Stewart

@CharlesStewart 사실, 나는 소스 스크립트에 익숙하지 않습니다. 감사합니다!
Sony Santos

5
입니다 source ./script같은?
amyassin

2
@amyassin : 그렇습니다
enzotib

2
1 .과는 source떠들썩한 파티에서와 동일하다. 2. ./파일 이름이 같은 디렉토리에 있으면 파일 이름 앞에 사용할 필요가 없습니다 . 다음 만 실행해도됩니다.. script
sobi3ch

19

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

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

.bashrc모든 대화식 쉘에 대해 설정하려면 파일에 추가해야합니다 .

이제 이것을 다음과 같이 실행할 수 있습니다 $ cdproj.


1
또한 스크립트를 사용하여 다음 명령이 실행되는 에코, 및 수 eval `./script` 또는 eval $(./script)해당 명령을 실행합니다. 이는 호출 쉘 환경을 업데이트해야하는 명령에 대한 일반적인 접근 방식입니다.
Keith Thompson

2
당신이 eval접근 하려고하는 경우 출력하는 것에 매우주의하십시오 .
jw013

13

사용 exec bash마지막에

bash 스크립트는 현재 환경 또는 하위 환경에서 작동하지만 상위 환경에서는 작동하지 않습니다.

그러나 다른 디렉토리에서 bash 스크립트를 실행 한 후 특정 디렉토리의 bash 프롬프트에 남아 있기를 원하기 때문에이 질문이 종종 제기됩니다 .

이 경우 스크립트 끝에서 자식 bash 인스턴스를 실행하십시오.

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

새로운 서브 쉘이 생성됩니다. exit스크립트가 처음 시작된 첫 번째 쉘로 돌아가려면 입력하십시오 .


허용 된 답변에서와 같이 스크립트를 소싱하는 exec것이
좋습니다

1
이 속임수는 debian 9 stretch에서 작동하지 않습니다.
vdegenne

3
이것이 잘못된 길입니다!
Dennis Williamson

3
아무도 이것에 대한 문제를 자세히 설명하지 않았기 때문에 (@Dennis를보고 있습니다) : (1) 이것을 실행할 때마다 새로운 영구 bash 프로세스가 생성됩니다. 세션에서 10 ~ 20 회 수행하면 11 ~ 21 개의 bash 프로세스가 쌓입니다. 이는 성능에 영향을 줄 수 있으며 exit(또는 Ctrl + D) 를 입력하여 세션을 완전히 종료하려고하면 11 ~ 21 번 수행해야합니다. (2) 실행 가능한 스크립트 사용의 또 다른 단점은 대화식 쉘 세션에서 쉘 옵션 (예 : dotglob또는  globstar) 을 설정  하면 새 쉘을 시작하기 때문에 옵션을 잃게된다는 것입니다.
G-Man,

1
아주 좋은 해결책! bash_profile에 내 별칭을 다시 작성 했으므로 이제 별도의 파일에 저장된 스크립트입니다. 스크립트를 사용하여 새로 만든 임시 폴더로 이동합니다. 이제 임시 bash 세션을 갖는 것이 훨씬 쉽습니다. 행동하는 SRP! 감사!
artyom.razinov

8

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

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

그런 다음 cd이름을 사용하여 디렉토리로 이동할 수 있습니다 proj.

cd proj

이 방법은 다음과 같이 짧은 이름을 사용하여 파일에 액세스 할 수 있기 때문에보다 유연합니다 cd.

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


4

수행하려는 작업에 따라 다른 솔루션이 스크립트 대신 함수를 생성 할 수 있습니다.

예:

파일에 함수를 작성하십시오 /home/aidin/my-cd-script.

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

그런 다음 파일 bashrc또는 zshrc파일 에 포함 하십시오.

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

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

$ my-cd

0

왜 "exec"를 사용하지 않습니까?

#!/bin/bash

cd someplace
exec bash

~/someplace

1
원하는 같은 것을 조심하십시오 . (거대한 나무 말! 내가 원하는 것!) 이것을 실행할 때마다 새롭고 지속적인 bash 프로세스가 생성됩니다. 세션에서 10 ~ 20 회 수행하면 11 ~ 21 개의 bash 프로세스가 누적됩니다. 이는 성능에 영향을 줄 수 있으며 exit(또는 Ctrl + D) 를 입력하여 세션을 완전히 종료하려고하면 11 ~ 21 번 수행해야합니다.
G-Man은

어디에서 문제가 될지 확실히 알 수있었습니다. 한 번만 사용하고, 필요한 작업을 수행 한 다음 종료하는 것이지만, 그것이 유일한 단점이라면 그와 함께 살 수 있습니다. 반면에 더 나은 솔루션이 있다면 기꺼이 살펴 보겠습니다.
paul

쉘 함수를 사용하는 이 질문에 대한 Aidin의 대답 과 별칭을 사용하는 Sachin Divekar의 대답 은 스크립트를 사용하는 것보다 (IMO) 더 나은 솔루션입니다. PS 스크립트 사용의 또 다른 단점은 쉘 옵션 (예 : dotglob또는  globstar)을 설정하면 새 쉘을 시작하기 때문에 옵션  을 잃게된다는 것입니다. … (계속)
G-Man, 'Reinstate

(계속)가 ... PPS 난 그냥 당신이 되풀이 기본적있는 것으로 나타났습니다 서지 Stroobandt의 답변을 에서 '?'이렇게하지 왜 '와'말하는  스택 교환 우리는 새로운 아이디어 및 / 또는 정보를 제공하는 답변을 기대, 그냥 논의하지 다른 답변.
G-Man, 'Reinstate

-1

함수를 사용하거나 &&를 사용하여이를 수행 할 수 있습니다. 다음 예제에서는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.