$PATH 및 .(소스) 파일을 임시로 설정하는 방법은 무엇입니까?

$PATH 및 .(소스) 파일을 임시로 설정하는 방법은 무엇입니까?

이것에 대해 생각하다. IFS실행 시에만 설정됩니다 read.

IFS='' read -r REPLY

그러나 내가 다음과 같은 작업을 수행하면 .(원천), 해당 코드 줄이 실행된 후에도 변수가 할당되고 변경됩니다.

PATH="/new_path:${PATH}" . script.sh
echo "$PATH"         # Value changed

왜 이런 일이 발생합니까? or 와 비슷한 명령인 Bash .와 같은 것 같아요 . 예를 들어 문서가 있습니까?sourcereadecho2.14.특수 내장 유틸리티, 이 행동을 언급했나요?

POSIX 호환 방식으로 $PATH.(소스) 파일을 임시로 설정하려면 어떻게 해야 합니까?

답변1

.특별한내장.

POSIX에 따르면:

 2. 단순 명령에 설명된 대로 특수 내장 유틸리티를 호출하기 전의 변수 할당은 내장 유틸리티가 완료된 후에도 유효한 상태로 유지됩니다. 이는 일반 내장 유틸리티나 기타 유틸리티에서는 발생하지 않습니다.

이 특정 요구 사항은 as를 호출할 때 sh(더 일반적으로는 posix해당 옵션이 활성화된 경우) POSIX 모드의 bash에서만 충족됩니다.

삭제하려면상세특별한내장형, POSIX 호환 셸에서 command접두사로 사용할 수 있음command그 자체는 일반적인 내장 함수가 아니라특별한하나. POSIX는 다음을 명시적으로 언급합니다.

command_name이 특수 내장 유틸리티 중 하나의 이름과 동일한 경우 특수 내장 유틸리티 시작 부분에 있는 열거 목록의 특수 속성은 나타나지 않습니다. 다른 모든 측면에서 command_name이 함수 이름이 아닌 경우 명령(옵션 없이)의 효과는 이를 생략하는 것과 동일해야 합니다.

bash-5.1$ echo printenv PATH > file
bash-5.1$ (PATH=/; PATH=/usr/bin . ./file; echo "$PATH")
/usr/bin
/
bash-5.1$ set -o posix
bash-5.1$ (PATH=/; PATH=/usr/bin . ./file; echo "$PATH")
/usr/bin
/usr/bin
bash-5.1$ (PATH=/; PATH=/usr/bin command . ./file; echo "$PATH")
/usr/bin
/

eval또는 와 같은 특수 내장 기능의 경우 이는 POSIX의 실수입니다. 이러한 내장 기능을 존중한다는 것은 또는 이후에 재개 .할 수 있으려면 쉘이 변수 스택 유형과 변수에 대한 효과적인 로컬 범위를 구현해야 함을 의미하기 때문입니다. , POSIX는 달리 지정하지 않습니다. 실제로는 모든 구현, 특히 POSIX 사양의 기반이 되는 ksh88에서 작동하지 않는다는 것을 알게 될 것입니다.$varvar=value command . filevar=value command eval some-codesh

답변2

POSIX 호환 방식으로 파일을 임시로 설정하는 방법은 무엇입니까 $PATH?.

OPATH=$PATH PATH=...
. someSource
PATH=$OPATH

답변3

이 답변은 bash에만 적용됩니다. POSIX와 완전히 호환되는 쉘에서는 작동하지 않습니다.

한 문장으로 할 수는 없나요?

예! 함수로 감싸십시오. 이 접근 방식에는 추가 변수가 필요하지 않습니다(가변 오염을 최소한으로 유지).

소스 파일:

$ cat script.sh 
echo "in script.sh file"

var='altered'

조달 문서:

$ cat test.sh 
#!/bin/bash

var='original'

echo $PATH
echo
_() { . "$1" ; }

PATH="/tmp:${PATH}" _ script.sh
echo
echo $PATH
echo
echo "$var"

echo소스 파일의 명령문과 변수는 파일이 성공적으로 획득되었는지 $var확인하는 데 사용됩니다 .script.sh

변경 사항은 $PATH함수 내에서만 적용됩니다 _(더 나은 이름을 사용할 수 있습니다). $PATH선언 후에는 변경되지 않습니다.

관련 정보