스크립트 파일

스크립트 파일 (Script Files)

스크립트 파일은 (거의) 어떤 Octave 명령의 나열이든 담고 있는 파일이에요. 마치 각 명령을 Octave 프롬프트에 직접 입력한 것처럼 읽혀서 평가돼요.

출처: 문서

본문

스크립트 파일은 (거의) 어떤 Octave 명령의 나열이든 담고 있는 파일이에요. 각 명령을 Octave 프롬프트에서 직접 입력한 것처럼 읽혀서 평가되며, 함수 안에 논리적으로 속하지 않는 명령들의 시퀀스를 수행하는 편리한 방법을 제공해요.

함수 파일과 달리 스크립트 파일은 function 키워드로 시작하면 안 돼요. 만약 그렇게 하면 Octave는 그것을 함수 파일로 간주하고, 정의되자마자 평가되어야 할 단일 함수를 정의한다고 생각해요.

스크립트 파일은 함수 파일과 또 다른 차이가 있는데, 스크립트 파일에 이름이 등장하는 변수들은 로컬 변수가 아니라 명령줄에서 보이는 다른 변수들과 같은 스코프에 있다는 점이에요.

스크립트 파일이 function 키워드로 시작하지 못하더라도, 단일 스크립트 파일 안에서 여러 함수를 정의하고 그것들을 한 번에 모두 불러올(실행은 하지 않고) 수 있어요. 그러려면 파일의 첫 토큰(주석과 기타 공백은 무시)이 function이 아닌 것이어야 해요. 평가할 다른 문장이 없다면 효과가 없는 문장을 쓸 수 있어요.

# Prevent Octave from thinking that this
# is a function file:

1;

# Define function one:

function one ()
  ...

이 함수들을 Octave가 읽어 내부 형태로 컴파일하게 하려면, 파일이 Octave의 로드 경로(path 함수로 접근 가능)에 있는지 확인한 다음 그 파일의 기본 이름을 입력하기만 하면 돼요. (Octave는 함수 파일을 검색하는 것과 같은 규칙으로 스크립트 파일도 검색해요.)

파일의 첫 토큰(주석 무시)이 function이면 Octave는 함수를 컴파일하고 실행하려 시도하며, 함수 정의 뒤에 나오는 공백이 아닌 문자들에 대해 경고 메시지를 출력해요.

Octave는 어떤 식별자의 정의를 실제로 평가할 필요가 있을 때까지 검색하지 않아요. 그렇기 때문에 스크립트 파일에 다음 문장들이 나오거나 명령줄에 입력되면, 함수 do_somethingfoo에서 참조되기 전에 정의되지 않았어도 Octave는 이들을 컴파일해요.

# not a function file:
1;
function foo ()
  do_something ();
endfunction
function do_something ()
  do_something_else ();
endfunction

함수가 실제로 평가될 때까지 Octave가 함수가 참조하는 모든 심볼을 해석할 필요가 없기 때문에 이것은 오류가 아니에요.

Octave는 필요할 때까지 정의를 찾지 않으므로, 다음 코드는 명령줄에 직접 입력하든, 스크립트 파일에서 읽든, 함수 본문의 일부든, 심지어 경로에 bar.m이라는 함수나 스크립트 파일이 있어도 항상 bar = 3을 출력해요.

eval ("bar = 3");
bar

함수 본문 안에 나타나는 이런 코드는, 함수가 컴파일되는 동안 정의가 해석된다면 Octave를 속일 수 있어요. 이 코드를 일관된 방식으로 평가하도록 Octave를 영리하게 만드는 것은 사실상 불가능해요.

Octave는 보통 file.m이라는 이름의 스크립트 파일에서 명령을 실행하지만, source 함수를 사용하면 어떤 파일에서든 명령을 실행할 수 있어요.

source는 파일의 내용을 파싱하고 실행해요. context를 지정하지 않으면 스크립트 파일에서 명령을 실행하는 것과 동일하지만, 파일 이름이 file.m이거나 실행 경로에 있을 필요가 없어요. context로 현재 컨텍스트 대신 현재 함수를 호출한 함수의 컨텍스트("caller") 또는 최상위 컨텍스트("base")에서 실행할 수 있어요.

더 알아보기

  • Octave 스크립트 파일 게시, 게시 마크업, Jupyter 노트북에 대한 내용을 이어서 보면 좋아요.
  • run 함수에 대한 정보도 함께 참고하세요.