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.