Bash 스크립트에서 현재 디렉토리 변경


190

스크립트에서 현재 디렉토리를 변경할 수 있습니까?

Bash에서 디렉토리 탐색을위한 유틸리티를 만들고 싶습니다. 다음과 같은 테스트 스크립트를 작성했습니다.

#!/bin/bash
cd /home/artemb

Bash 쉘에서 스크립트를 실행할 때 현재 디렉토리는 변경되지 않습니다. 스크립트에서 현재 쉘 디렉토리를 변경할 수 있습니까?


2
개선 제안 : 단지 대신 (출력을 억제 pushd하기 >/dev/null위해 리디렉션 됨 )을 사용 cd하면 나중에로 이전 디렉토리로 돌아갈 수 있습니다 popd.
mklement0

답변:


173

스크립트를 쉘 함수로 변환해야합니다.

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

그 이유는 각 프로세스마다 고유 한 현재 디렉토리가 있고 쉘에서 프로그램을 실행할 때 새 프로세스에서 실행되기 때문입니다. 표준 "cd", "pushd"및 "popd"는 쉘 인터프리터에 내장되어있어 쉘 프로세스에 영향을줍니다.

프로그램을 쉘 기능으로 만들어서 자체적 인 in-process 명령을 추가하면 디렉토리 변경 사항이 쉘 프로세스에 반영됩니다.


2
tcsh에서 어떻게 하시겠습니까?
joedborg

4
+1. 내가 주목 한 것은 파일에 있었으므로 함수를 호출하기 전에 정의해야합니다. 저처럼 경험이없는 사람에게 도움이 될 수 있습니다.
Bhushan

함수 정의와 별칭 생성의 가장 큰 차이점은 무엇입니까?
HelloGoodbye

1
이 myprog.sh 파일을 만들고 .bashrc에 추가 한 후에는 어떻게 스크립트를 실행합니까? 다른 쉘 파일에서 또는 쉘에서 직접 함수를 호출해야합니까? 그것은 전혀 작동하지 않는 것 같습니다 ...
Andrea Silvestri

1
@AndreaSilvestri 로그 아웃했다가 다시 로그인하거나 .bashrc를 소스하십시오. .bashrc에 추가하면 .bashrc가 실행될 때까지 아무것도하지 않습니다.
Jon Strayer

214

스크립트를 시작하면 환경 만 상속하는 새 프로세스가 작성됩니다. 끝나면 끝납니다. 현재 환경은 그대로 유지됩니다.

대신 다음과 같이 스크립트를 시작할 수 있습니다.

. myscript.sh

.이 변경 될 수 있으므로, 현재의 환경에서 스크립트를 평가합니다


4
당신이 옳기 때문에 +1. 나는 진심으로 의심하지만 그가 필요할 때마다 디렉토리 변경 스크립트를 소스로 원할 것입니다. 또한, .sh확장은 완전히 eww입니다. 사용하지 마십시오.
lhunath

1
예, 일반적으로 사용하지 않는 것이 좋습니다. 대부분의 경우 현재 환경에 문제가없는 것이 기쁩니다. 그러나 올바른 위치로 변경 한 다음 나에게 몇 가지 설정 작업을 수행하는 스크립트가 있습니다. 그들도. Btw. .sh는 물론 개인적인 스타일의 문제입니다. 시스템 전체에 스크립트를 설치하는 동안 사용하지 않을 것입니다. 그러나 내 ~ / 빈에서 나는 그것들이 무엇인지 알기 위해 사용합니다 :)
Norbert Hartl

11
@lhunath 왜 .sh 확장자가 완전히 eww입니까?
Carl Pritchett


1
이 기사의 추론은 가짜입니다. 결과는 미리 알려진 것으로 보이지만 그 이유를 찾는 것은 쉽지 않았습니다. 그래서 나는 그것이 개인적인 스타일의 문제라고 주장한다.
Norbert Hartl

55

답을 읽을 수없고 너무 복잡하기 때문에 이것이 요청자가해야 할 일이라고 생각합니다

  1. 해당 스크립트를 PATH
  2. 스크립트를 다음과 같이 실행하십시오. . scriptname

.(점) 확인 스크립트가 자식 쉘에서 실행되지 않습니다 만들 것입니다.


38

위의 내용을 정리하면 별칭을 만들 수 있습니다

alias your_cmd=". your_cmd"

선행 "."을 쓰지 않으려면 스크립트를 쉘 환경에 소스를 제공하거나 스크립트가 올바르게 작동하기 위해 수행해야하는 것을 기억하고 싶지 않을 때마다.


재부팅해도 계속 유지됩니까?
SDsolar

1
@SDsolar ~ / .bashrc 파일에 이것을 추가하여 영구적으로 유지해야합니다. 나를 위해 매력처럼 작동합니다.
Rafał G.

~ / .bash_aliases에 입력 가능
Champ

~/.bash_aliasesBash가 시작될 때 @Champ 가 항상 소스되지는 않습니다.
Mateusz Piotrowski

31

bash를 사용하는 경우 별칭을 시도 할 수 있습니다.

.bashrc 파일에 다음 줄을 추가하십시오.

alias p='cd /home/serdar/my_new_folder/path/'

명령 행에 "p"를 쓰면 디렉토리가 변경됩니다.


1
별칭의 경우 +1 쉘 기능은 흥미롭지 만 OP는 cd로 간단한 탐색을 요청했습니다. 나는 대부분의 사람들이 탐색 소스 코드 지점에 그 별칭이 같은 스크립트를 필요 같은데요 충분
브래드 드레

19

bash 스크립트를 실행하면 현재 환경이나 자식 환경에서 작동하며 부모 환경에서는 작동하지 않습니다.

목표가 명령을 실행하는 것이라면 : goto.sh / home / test 그런 다음 / home / test에서 대화식으로 작업하는 방법 중 하나는 스크립트 내에서 bash 대화식 서브 쉘을 실행하는 것입니다.

#!/bin/bash
cd $1
exec bash

이렇게하면이 쉘의 종료 (exit 또는 Ctrl + C)까지 / home / test에있게됩니다.


나는 이것이 내가 실행중인 쉘 스크립트의 문제를 해결할 것이라고 생각했지만 대신 쉘을 시작하고 내가 원하는 것을 잊어 버렸다.
vwvan

14

PUSHD 현재 디렉토리는 디렉토리 스택에 밀어 그것은 주어진 디렉토리로 변경됩니다, POPD 스택의 상단에있는 디렉토리를 얻고 그것을 다음 변경합니다.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

2
이것은 내 질문에 대한 답변입니다. S3 init 스크립트 에이 솔루션을 적극적으로 배포하면 완벽하게 작동합니다. 감사합니다 @seb.
19 시간

5

간단하게

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

마지막 줄 옆 에이 코드를 추가하십시오.

alias yourcommand="cd /the_path_you_wish"

그런 다음 편집기를 종료하십시오.

그런 다음 다음을 입력하십시오.

source ~/.bashrc or source ~/.bash_profile on MAC.

지금 당신은 사용할 수 있습니다 yourcommand 터미널에서



3

기본적으로 우리 cd..는 모든 디렉토리에서 돌아 오는 데 사용 합니다. 한 번에 돌아와야 할 디렉토리 수를 제공하여 더 쉽게 만들려고 생각했습니다. alias 명령을 사용하여 별도의 스크립트 파일을 사용하여이를 구현할 수 있습니다. 예를 들면 다음과 같습니다.

code.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 elif [ "$1" -eq 2 ]; then
  cd ../..
 elif [ "$1" -eq 3 ]; then
  cd ../../..
 elif [ "$1" -eq 4 ]; then
  cd ../../../..
 elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

source code.sh현재 쉘에서 사용한 후 다음을 사용할 수 있습니다.

$back 2 

현재 디렉토리에서 두 단계 뒤로 이동합니다. 여기 에 자세히 설명되어 있습니다 . ~ / .bashrc에 코드를 넣는 방법도 설명되어 있으므로 열려있는 모든 새 쉘에이 새 별칭 명령이 자동으로 적용됩니다. 더 많은 if conditions인수를 추가하여 코드를 수정하여 특정 디렉토리로 이동하는 새 명령을 추가 할 수 있습니다 . 여기 git에서 코드를 가져올 수도 있습니다 .


좋은 솔루션, 그래서 당신은 당신의 bash 프로필을 엉망으로 만들지 마십시오 :)
J4cK

0

이 방법은 더 쉽습니다.

명령 윈도우가 열릴 때 기본 디렉토리 아래에있는 관리자 인 개인 iMac에서 / Users / jdoe로 이동하면 다음 디렉토리로 이동합니다. /Users/jdoe/Desktop/Mongo/db.3.2.1 /큰 상자.

작업을 수행 할 수있는 단계는 다음과 같습니다.

  1. vi mongobin, 여기에 cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin첫 번째 줄로 입력했습니다 .
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

짜잔!


0

또한 쉽게 탐색 할 수 있도록 염소 라는 유틸리티를 만들었습니다 .

GitHub 에서 소스 코드를 볼 수 있습니다 .

현재로 v2.3.1 사용 개요 다음과 같다 :

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix

0

새로운 쉘을 생성하지 않고 다른 프로젝트에 대해 동일한 작업을 수행하고 싶습니다.

귀하의 경우 :

cd /home/artemb

_script를 다음과 같이 저장하십시오.

echo cd /home/artemb

그런 다음 다음을 사용하여 실행하십시오.

\`./the_script\`

그런 다음 동일한 쉘을 사용하여 디렉토리로 이동하십시오.



0

경로를 선언하십시오.

PATH='/home/artemb'     
cd ${PATH}

0

PWD스크립트에 쓰고 내 보내면 변경 사항이 유지됩니다.

export PWD=/your/desired/directory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.