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

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

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

#!/bin/bash
cd /home/artemb

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



답변

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

#!/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 명령을 추가하면 디렉토리 변경 사항이 쉘 프로세스에 반영됩니다.


답변

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

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

. myscript.sh

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


답변

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

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

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


답변

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

alias your_cmd=". your_cmd"

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


답변

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

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

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

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


답변

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

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

#!/bin/bash
cd $1
exec bash

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


답변

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

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