이것에 대해 생각하다. IFS
실행 시에만 설정됩니다 read
.
IFS='' read -r REPLY
그러나 내가 다음과 같은 작업을 수행하면 .
(원천), 해당 코드 줄이 실행된 후에도 변수가 할당되고 변경됩니다.
PATH="/new_path:${PATH}" . script.sh
echo "$PATH" # Value changed
왜 이런 일이 발생합니까? or 와 비슷한 명령인 Bash .
와 같은 것 같아요 . 예를 들어 문서가 있습니까?source
read
echo
2.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에서 작동하지 않는다는 것을 알게 될 것입니다.$var
var=value command . file
var=value command eval some-code
sh
답변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
선언 후에는 변경되지 않습니다.