예, 쉘 bash
은 특히 한 번에 한 줄씩 파일을 읽도록주의하므로 대화식으로 파일을 사용할 때와 동일하게 작동합니다.
파이프와 같은 파일을 찾을 수 없을 때 문자를 bash
지나 읽지 않도록 한 번에 한 바이트 씩 읽습니다 \n
. 파일을 검색 할 수 있으면 한 번에 전체 블록을 읽음으로써 최적화되지만 \n
.
즉, 다음과 같은 작업을 수행 할 수 있습니다.
bash << \EOF
read var
var's content
echo "$var"
EOF
또는 스스로 업데이트되는 스크립트를 작성하십시오. 그것이 당신에게 그 보증을주지 않으면 할 수 없을 것입니다.
지금, 당신이 그런 일을하고 싶어하는 경우는 거의 없으며, 알다시피, 그 기능이 유용한 것보다 더 자주 방해되는 경향이 있습니다.
이를 피하려면 파일을 제자리에서 수정하지 마십시오 (예 : 사본을 수정하고 사본을 제자리로 이동 (예 : sed -i
또는 perl -pi
일부 편집기의 경우)).
또는 다음과 같이 스크립트를 작성할 수 있습니다.
{
sleep 20
echo test
}; exit
( ; exit
와 같은 줄에 }
있어야합니다. 닫는 바로 앞에 괄호 안에 넣을 수도 있습니다).
또는:
main() {
sleep 20
echo test
}
main "$@"; exit
쉘은 exit
무언가를 시작하기 전에 스크립트를 읽어야합니다 . 그러면 셸이 스크립트에서 다시 읽히지 않습니다.
그것은 전체 스크립트가 메모리에 저장됨을 의미합니다.
스크립트 구문 분석에도 영향을 줄 수 있습니다.
예를 들어,에 bash
:
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
UTF-8로 인코딩 된 U + 00E9를 출력합니다. 그러나 다음과 같이 변경하면
{
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
}
이 \ue9
명령은이 경우에 해석되는 당시에 유효했던 캐릭터 세트로 확장 될 전에export
명령이 실행된다.
또한 일부 쉘 에서 source
aka .
명령을 사용하면 소스 파일에 대해 동일한 종류의 문제가 발생합니다.
그건 그렇지 않다의 bash
그 것처럼 source
명령을 해석하기 전에 완전히 파일을 읽습니다. bash
구체적으로 작성하는 경우 스크립트 시작 부분에 추가하여 실제로 사용할 수 있습니다.
if [[ ! $already_sourced ]]; then
already_sourced=1
source "$0"; exit
fi
(나는 당신이 미래의 버전 bash
이 현재 제한으로 볼 수있는 행동을 바꿀 수 있다고 상상할 수 있지만 (bash와 AT & T ksh는 말할 수있는 한 POSIX와 같은 유일한 쉘입니다) 그리고 already_sourced
이 변수가)이 BASH_SOURCE 변수의 내용에 영향을 미칠 것을 언급하지 않기에, 환경에없는 것을 가정으로 트릭은 비트 취성