programing

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

iphone6s 2023. 5. 7. 11:16
반응형

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

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

Bash에서 디렉터리 탐색 유틸리티를 만들고 싶습니다.다음과 같은 테스트 스크립트를 만들었습니다.

#!/bin/bash
cd /home/artemb

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

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

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

. myscript.sh

.될 수 있습니다.

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

#!/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"는 셸 인터프리터에 내장되어 셸 프로세스에 영향을 줍니다.

프로그램을 셸 함수로 만들면 프로세스 내 명령어가 추가되고 디렉토리 변경 사항이 셸 프로세스에 반영됩니다.

답변의 읽기 불가능성과 중복성에 비추어 볼 때, 저는 이것이 요청자가 해야 할 일이라고 생각합니다.

  1. 해당 스크립트를 에 추가합니다.PATH
  2. 스크립트를 실행합니다.. scriptname

.(점)은 스크립트가 하위 셸에서 실행되지 않도록 합니다.

위의 내용을 종합하면, 당신은 가명을 만들 수 있습니다.

alias your_cmd=". your_cmd"

셸 환경에 스크립트를 소스할 때마다 선행 "."를 작성하지 않으려는 경우 또는 스크립트가 올바르게 작동하려면 이 작업을 수행해야 합니다.

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

.svrc 파일에 다음 행을 추가합니다.

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

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

bash 스크립트를 실행하면 부모가 아닌 현재 환경이나 자식 환경에서 작동합니다.

명령어 goto.sh /home/test를 실행하는 것이 목표라면 /home/test에서 대화형으로 작업하는 한 가지 방법은 스크립트 내에서 bash 대화형 하위 셸을 실행하는 것입니다.

#!/bin/bash
cd $1
exec bash

이렇게 하면 이 셸을 종료(종료 또는 Ctrl+C )할 때까지 /home/test에 있게 됩니다.

pushd를 사용하면 현재 디렉토리가 디렉토리 스택에 푸시되고 지정된 디렉토리로 변경됩니다. popd는 스택의 맨 위에 있는 디렉토리를 가져와 변경됩니다.

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

다음으로 이동

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.

이제 사용할 수 있습니다. 터미널의 명령입니다.

디렉토리를 변경하기 위한 스크립트를 만들었습니다. https://github.com/ygpark/dj .

기본적으로 사용합니다.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: 재셸에다음사수있다습니현용할을서▁:다▁use▁in현을 사용할 수 있습니다.

$back 2 

현재 디렉토리에서 두 단계 뒤로 이동합니다.여기에 자세히 설명되어 있습니다.여는 모든 새 셸에 이 새 별칭 명령이 자동으로 사용되도록 코드를 ~/.bashrc에 넣는 방법도 저쪽에 설명되어 있습니다.추가로 코드를 수정하여 특정 디렉토리로 이동하는 새 명령을 추가할 수 있습니다.if conditions그리고 다른 주장들.여기 있는 깃에서 코드를 뽑아낼 수도 있습니다.

셸 스크립트에서 아래의 cd 행을 추가합니다.

exec $SHELL

이것이 저의 현재 bash(데비안에서 테스트됨) 방식입니다.더 좋은 방법이 있을 수도 있습니다.

exec bash를 사용하지 마십시오. 예를 들어 다음과 같습니다.

#!/bin/bash
cd $1
exec bash

작동하는 것처럼 보이는 동안 스크립트를 실행하고 스크립트를 완료한 후에는 올바른 디렉터리에 있게 되지만 하위 셸에서 Ctrl+D를 눌러 확인할 수 있습니다. 그러면 하위 셸이 종료되어 원래 디렉터리로 돌아갑니다.

일반적으로 스크립트 사용자가 실행 중인 스크립트가 반환된 후에는 스크립트 사용자가 남아 있지 않은 상태가 됩니다. 이는 스크립트 사용자가 하위 셸에 있다는 것이 분명하지 않기 때문입니다. 이제 기본적으로 셸이 하나만 있다고 생각했을 때 셸이 두 개 열려 있기 때문입니다.그들은 이 하위 셸을 계속 사용하면서도 깨닫지 못할 수 있으며, 의도하지 않은 결과를 초래할 수 있습니다.

스크립트를 종료하고 새 디렉터리의 하위 셸을 열어두려면 PS1 변수를 변경하여 스크립트 사용자가 하위 셸이 열려 있음을 시각적으로 표시하도록 하는 것이 좋습니다.

여기 제가 생각해낸 예가 있습니다.두 개의 파일, 하나의 외부 파일입니다.당신이 직접 부르는 sh, 그리고 내부.외부 내부에서 공급되는 sh.sh 스크립트외부 스크립트는 두 개의 변수를 설정한 다음 내부 스크립트의 소스를 지정하고 이후 두 개의 변수를 반향시킵니다(두 번째 변수는 내부 스크립트에 의해 방금 수정됨).그런 다음 현재 사용자의 ~/.bashrc 파일의 임시 복사본을 만들고 여기에 PS1 변수에 대한 재정의와 정리 루틴을 추가한 다음 마지막으로 .bashrc.tmp 파일을 가리키는 exec bash --rcfile을 실행하여 수정된 프롬프트 및 정리 루틴을 포함하여 수정된 환경에서 bash를 초기화합니다.

아우터 뒤에.sh가 종료되면 원하는 디렉토리(이 경우 testdir/는 내부에 의해 입력됨)의 하위 셸 안에 남게 됩니다.shscript)는 시각적 표시기로 명확하게 표시되며, 하위 셸에서 나가면 .tvrc.tmp 파일이 정리 루틴에 의해 삭제되고 시작한 디렉터리로 돌아갑니다.

더 현명한 방법이 있을지도 모르지만, 그것이 제가 약 40분간의 실험을 통해 알아낼 수 있는 가장 좋은 방법입니다.

파일 1: 외부.

#!/bin/bash

var1="hello"
var2="world"

source inner.sh

echo $var1
echo $var2

cp ~/.bashrc .bashrc.tmp

echo 'export PS1="(subshell) $PS1"' >> .bashrc.tmp

cat <<EOS >> .bashrc.tmp
cleanup() {
    echo "cleaning up..."
    rm .bashrc.tmp
}

trap 'cleanup' 0
EOS

exec bash --rcfile .bashrc.tmp

파일 2: 내부.

cd testdir
var2="bird"

그런 다음 실행:

$ mkdir testdir
$ chmod 755 outer.sh

$ ./outer.sh

출력해야 합니다.

hello
bird

그런 다음 exec bash를 사용하여 하위 셸로 이동하지만 다음과 같은 메시지가 표시됩니다.

(subshell) user@computername:~/testdir$

그리고 하위 셸에서 Ctrl-D를 사용하는 경우 testdir/디렉토리에서 임시 .bashrc.tmp 파일을 삭제하여 정리해야 합니다.

하위 셸에서 PS1 var를 제대로 변경하기 위해 .bashrc 파일을 그렇게 복사하는 것보다 더 좋은 방법이 있는지 궁금합니다.

이것은 위의 답변을 단순화한 모음입니다.
셸 파일 만들기shellfile.sh스크립트에서 함수 내부의 디렉토리를 변경

#!/bin/bash

cd folder1/folder2/

이제 스크립트 실행.그 전에
.현재 스레드/스레드를 사용하여 스크립트를 실행합니다.

. shellfile.sh

저는 이 방법이 더 쉽습니다.

사용자가 관리자인 개인 iMac에서 명령 창을 열 때 기본 디렉토리인 /Users/jdoe 아래로 이동할 디렉토리가 /Users/jdoe/Desktop/Mongo/db.3.2.1/bin이라고 가정합니다.

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

  1. 한 vi 제가입력한▁mong vi mongobin:cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin제1행으로서
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Voila!

저는 또한 염소라는 유틸리티를 만들어서 여러분이 더 쉽게 탐색할 수 있도록 했습니다.

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

저는 다른 프로젝트에 대해 새로운 껍데기를 만들지 않고 같은 일을 하는 것을 좋아합니다.

당신의 경우:

cd /home/artemb

_script를 다음과 같이 저장합니다.

echo cd /home/artemb

그런 다음 다음 다음과 같이 시작합니다.

\`./the_script\`

그런 다음 동일한 셸을 사용하여 디렉토리에 도달합니다.

경로 선언:

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

언급URL : https://stackoverflow.com/questions/874452/change-the-current-directory-from-a-bash-script

반응형